暴露C++给Lua时应该使用什么策略?

我有一个 C++ 库,其中将功能开放给 Lua,我正在寻求关于组织 Lua 代码的最佳方式的建议。

该库是一个游戏引擎,具有基于组件的游戏对象系统。我希望能够将其中一些组件编写为 Lua 类。我正在使用 LuaBind,因此我可以这样做,但必须做出一些实现选择,并希望知道其他人是如何做的。

我应该只有一个全局 lua_State,还是每个对象、每个场景都有一个? 这听起来像是很多内存开销,但会保持一切的分离。

我应该只有一个 GLOBALS 表,还是每个对象都有一个,可以在调用成员之前放置它?这似乎会最小化一些类决定使用全局变量,另一个不小心覆盖它的机会,但比拥有多个 lua_States 的内存开销要小。

或者我应该将所有内容全部放在一个全局表中?

另一个问题涉及 Lua 代码本身。有两种策略……首先将所有类定义都放在一个地方,加载它们时应用程序启动;其次,对于每个文件只放置一个类定义,并在需要实例化它时简单地确保该文件已加载。

我很感激任何人的想法,谢谢。

原文链接 https://stackoverflow.com/questions/1395933

点赞
stackoverflow用户43534
stackoverflow用户43534

一项考虑是如何分配线程。

如果你想要同时运行两个游戏对象的代码,那么它们应该有各自独立的 lua_States,以便它们可以同时运行。当然,这也意味着它们在除了 C 代码之外不能共享任何状态(在 C 代码中仍需注意线程安全性)。

2009-10-21 00:29:33
stackoverflow用户137828
stackoverflow用户137828

虽然LuaBind非常精巧和方便,但当你的引擎变得越来越庞大,编译时间也会急剧增长。

如果你已经有或者打算添加消息系统(我强烈推荐,特别是网络方面),那么这会显著简化问题。在这种情况下,你只需要绑定几个关键函数,以便与消息系统进行接口交互。这将使你的编译时间缩短,并让你拥有一个非常灵活的系统。

由于你正在进行面向组件的引擎开发(顺便说一句,这是个好选择),因此将脚本作为对象组件进行集成更为合理。这种情况下,通常应该将每个脚本组件作为一个新的协程来运行每个特定对象的行为。你不需要过多地担心内存问题,Lua状态非常轻量化,如果将内存管理器与Lua进行接口,可以使其运行速度更快。

如果将脚本作为组件实现,仍然有必要加载全局或每个关卡的脚本(用于协调其他对象的事件触发,或者可能是敌人生成计时器)。

关于加载脚本,一次性加载关卡所需脚本并将其保存在全局表中以方便快速访问也不是坏习惯。加载Lua脚本非常快速,特别是如果对其进行预编译。

2009-11-16 10:14:16
stackoverflow用户1824182
stackoverflow用户1824182

就 Lua 代码而言,我建议在应用启动时加载所有内容(除非您确实需要按需 “惰性” 加载核心类)。这通常简化了维护和调试。而在加载了不再需要的代码的情况下,垃圾回收器会很快清理它们。 :-)

2013-02-14 16:53:28