我有一个c ++库,它具有暴露给Lua的功能,我正在寻找有关组织我的lua代码的最佳方法的意见.
该库是一个游戏引擎,具有基于组件的游戏对象系统.我希望能够将这些组件中的一些作为Lua中的类编写.我正在使用LuaBind,所以我可以做到这一点,但我必须做出一些实现选择,并且想知道其他人是如何做到的.
我应该只有一个全局lua_State,或每个对象一个,每个场景一个,等等?这听起来像很多内存开销,但会保持一切美观和分离.
我应该有一个GLOBALS表,还是每个对象一个表,可以在调用成员之前将其放置到位?这似乎可以最大限度地降低某些类决定使用全局变量的可能性,并且另一个类意外地覆盖它,与使用许多lua_States相比,内存开销更少.
或者我应该只在一个全局表中插入所有内容?
另一个问题涉及它自己的lua代码.出现两种策略......首先在一个地方推送所有类定义,在应用程序启动时加载它们,然后在每个文件中放置一个类定义,并在我需要实例时确保加载文件.
我很感激任何人对此的看法,谢谢.
虽然LuaBind当然非常漂亮和方便,但随着引擎的增长,编译时间也会大幅增加.
如果您已经或正在计划添加消息传递系统(我强烈建议,特别是网络),那么它可以显着简化问题.在这种情况下,您需要做的只是将几个关键函数绑定到与消息传递系统的接口.这将使您的编译时间缩短,并为您提供一个非常灵活的系统.
由于您正在使用基于组件的引擎(很好的选择BTW),因此将脚本集成为对象组件更有意义.这样,通常使每个脚本组件成为运行每个特定对象的行为的新协程更有意义.你不必过多担心内存,Lua状态非常轻,如果你将你的内存管理器与Lua连接起来,可以做得非常快.
如果您将脚本作为一个组件实现,那么加载全局或每级脚本仍然是个好主意(用于协调其他对象的事件触发器,或者可能是敌人产生计时器).
就加载脚本而言,只需一次加载一个级别所需的脚本,并将它们保存在一个全局表中以进行fas访问,加载lua脚本非常快,特别是如果你预先编译了它们.