【问题标题】:What strategy should be used when exposing c++ to Lua将 c++ 暴露给 Lua 时应该使用什么策略
【发布时间】:2013-02-15 00:53:28
【问题描述】:

我有一个 c++ 库,它具有向 Lua 公开的功能,并且正在就组织我的 lua 代码的最佳方式征求意见。

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

我应该只有一个全局 lua_State,还是每个对象一个,每个场景一个,等等? 这听起来像很多内存开销,但可以让所有内容保持良好和独立。

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

或者我应该把所有东西都放在一个全局表中?

另一个问题涉及 lua 代码本身。出现两种策略...首先将所有类定义放在一个位置,在应用程序启动时加载它们,其次为每个文件放置一个类定义,并确保在需要实例化文件时加载该文件。

感谢任何人对此的想法,谢谢。

【问题讨论】:

    标签: lua


    【解决方案1】:

    虽然 LuaBind 确实非常漂亮和方便,但随着引擎的增长,您的编译时间也会急剧增加。

    如果您已经拥有或计划添加消息传递系统(我强烈推荐,特别是用于网络),那么它可以显着简化问题。在这种情况下,您需要做的只是简单地绑定几个关键函数来与消息传递系统交互。这将缩短您的编译时间,并为您提供一个非常灵活的系统。

    由于您正在做一个基于组件的引擎(BTW 不错的选择),将脚本集成为对象组件更有意义。通过这种方式,将每个脚本组件作为一个新的协程来运行每个特定对象的行为通常更有意义。您不必过多担心内存,Lua 状态非常轻,如果您将内存管理器与 Lua 接口,则可以非常快。

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

    就加载脚本而言,最好的做法是一次性加载关卡所需的脚本,并将它们保存在全局表中以便快速访问,lua 脚本的加载速度非常快,特别是如果您预编译了它们。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好点(+1),虽然线程化游戏逻辑不是我刚才考虑的事情。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-10-26
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        相关资源
        最近更新 更多