将c ++暴露给Lua时应该使用什么策略

时间:2009-09-08 19:44:44

标签: lua

我有一个c ++库,它具有暴露给Lua的功能,我正在寻找有关组织我的lua代码的最佳方法的意见。

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

我应该只有一个全局lua_State,还是每个对象一个,每个场景一个,等等? 这听起来像是大量的内存开销,但会保持一切美观和分离。

我应该有一个GLOBALS表,还是每个对象一个,可以在调用成员之前放置一个?这似乎可以最大限度地降低某些类决定使用全局变量的可能性,而另一个类会意外地覆盖它,与使用许多lua_States相比,内存开销更少。

或者我应该只在一个全局表中插入所有内容?

另一个问题涉及到lua代码。有两种策略出现......首先在一个地方推送所有类定义,在应用程序启动时加载它们,然后在每个文件中放置一个类定义,并在我需要实例时确保加载文件。

我很感激任何人对此的看法,谢谢。

3 个答案:

答案 0 :(得分:5)

虽然LuaBind当然非常漂亮和方便,但随着引擎的增长,编译时间也会大幅增加。

如果您已经或正计划添加消息传递系统(我强烈建议,特别是网络),那么它会显着简化问题。在这种情况下,您需要做的只是将几个关键函数绑定到与消息传递系统的接口。这将使您的编译时间缩短,并为您提供一个非常灵活的系统。

由于您正在使用基于组件的引擎(Good choice BTW),因此将脚本集成为对象组件更有意义。这样,通常使每个脚本组件成为运行每个特定对象的行为的新协程更有意义。你不必过多担心内存,Lua状态非常轻,如果你将你的内存管理器与Lua连接,可以很快地完成。

如果您将脚本作为一个组件实现,那么加载全局或每级脚本仍然是一个好主意,(以协调其他对象的事件触发器,或者可能是敌人产生计时器)。

就加载脚本而言,只需一次加载一个级别所需的脚本,并将它们保存在一个全局表中以进行fas访问,加载lua脚本的速度非常快,这不是一件坏事。 ,特别是如果你预先编译它们。

答案 1 :(得分:2)

一个考虑因素是你计划如何解决问题。例如,如果你想并行运行两个游戏对象的代码,那么他们真的应该拥有自己独立的lua_States,以便它们可以同时运行。 (当然,这也意味着它们不能真正共享任何状态,除非通过C代码,您需要了解线程安全性。)

答案 2 :(得分:1)

关于Lua代码,我建议在应用程序启动时加载所有内容(除非你真的需要按需“懒惰”加载你的核心类)。它通常简化了维护和调试。在不再需要加载代码的情况下,垃圾收集器会快速清理它。 : - )