Lua C++类绑定垃圾回收关闭

Lua C++ class binding garbage collection off

本文关键字:C++ 绑定 Lua      更新时间:2023-10-16

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

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

然而,我们的项目自己管理游戏对象(这意味着我们决定何时删除、创建游戏对象),我想知道我是否可以禁用 Lua 的垃圾回收。具体来说,我可以尝试将元表中的__gc替换为 nil 或不执行任何操作的函数吗?

我的补偿是使用包含lightuserdata(this指针)和静态函数的表,该函数检索"this指针"并手动调用成员函数。但是,由于程序员应该手动使包装器静态函数,因此很快就会很脏且难以管理。

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

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

如果您希望对象的生存期由Lua和C++同时管理,则可以对对象使用std::shared_ptr,并让Lua用户数据也保存这样一个智能指针,这样两个世界都可以在同一个引用计数器上运行,即使在Lua管理的指针的情况下发生了一些额外的"东西"。

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