gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:08:47 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

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

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

就加载脚本而言,这不是一个坏习惯,只需一次加载关卡所需的脚本,并将它们保存在全局表中以便快速访问,lua 脚本的加载非常快,特别是如果你预编译了它们。

关于lua - 将 c++ 暴露给 Lua 时应该使用什么策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1395933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com