2

我目前在一个游戏项目中,必须将 Lua 集成到游戏引擎中,以向脚本用户公开游戏对象和组件的接口。

我试图研究将 C++ 类对象绑定到 Lua 的方法,我发现大多数文档都解释了如何使用 userdata 类型进行绑定。

然而,我们的项目自己管理游戏对象(这意味着我们决定何时删除、创建游戏对象),我想知道我是否可以禁用 Lua 的垃圾收集。具体来说,我可以尝试将__gcmetatable 替换为 nil 或什么都不做的函数吗?

我的补偿是使用包含 lightuserdata(this 指针)的表和检索“this 指针”并手动调用成员函数的静态函数。然而,由于程序员应该手动制作包装器静态函数,它很快就会变得肮脏且难以管理。

我可以获得一些正确使用的良好文档或您对类似问题的解决方案的链接吗?

4

2 回答 2

3

如果您的游戏对象由您的游戏引擎管理,只需让您的 Lua 用户数据对象成为指向您的游戏对象的普通指针,这样 Lua 的 GC 只会收集它们,而不是实际的对象。

如果你希望你的对象的生命周期同时由 Lua 和 C++ 管理,你可以例如使用std::shared_ptrs 到你的对象,并且让 Lua 用户数据也持有这样一个智能指针,这样两个世界都在同一个引用计数器上运行,即使在 Lua 管理的指针的情况下还有一些额外的“东西”。

于 2013-10-15T18:35:42.500 回答
0

LuaBridge文档同时描述了如何解决您的问题,并提供了一个开箱即用的解决方案 - LuaBridge。你不需要自己动手。您还可以考虑其他几个绑定库。

于 2013-10-18T19:02:12.797 回答