2013-10-15 85 views
2

我目前正在一个游戏项目中,并且必须将Lua整合到游戏引擎中,以将游戏对象和组件的界面暴露给脚本用户。Lua C++类绑定垃圾收集关

我试图研究如何将C++类对象绑定到Lua,并且我发现大多数文档解释了如何使用userdata类型来完成它。然而,我们的项目自己管理游戏对象(这意味着我们决定何时删除,创建游戏对象),我不知道是否可以禁用Lua的垃圾回收。具体来说,我可以尝试用metatable替换__gc为零还是不起作用的函数?

我的补偿是使用包含lightuserdata(this指针)的表和静态函数来检索“this指针”并手动调用成员函数。但是,由于程序员应该手动进行封装静态功能,因此很快就会变得很脏并且很难管理。

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

回答

3

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

如果你想让你的对象的生命周期由Lua和C++来管理,你可以例如使用std::shared_ptr到你的对象,并让Lua用户数据也保存这样一个智能指针,这样两个世界都可以运行相同的引用计数器,即使在Lua管理指针的情况下还会有一些额外的“内容”。

+0

谢谢你的回应。 然而,我并没有完全明白让lua userdata成为普通指针。 1.与此有什么特别的区别和使用lightuserdata? 2.它如何有益? – user2883715

+0

@ user2883715 userdata和light userdata之间的一个主要区别是,只有userdata对象具有每个对象元表;这是因为轻量级用户数据基本上就像一个数字,只有'void *'而不是'double'(或者任何您配置为数字数据类型的数据)。这就是为什么当你需要每个对象的元表时,你需要使用userdata而不是light userdata。然后你应用另一级间接寻常的原则 - 如果你想用指针或智能指针的userdata,那就是你坚持的原则...... –

0

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