暴露C++给Lua时应该使用什么策略?
我有一个 C++ 库,其中将功能开放给 Lua,我正在寻求关于组织 Lua 代码的最佳方式的建议。
该库是一个游戏引擎,具有基于组件的游戏对象系统。我希望能够将其中一些组件编写为 Lua 类。我正在使用 LuaBind,因此我可以这样做,但必须做出一些实现选择,并希望知道其他人是如何做的。
我应该只有一个全局 lua_State,还是每个对象、每个场景都有一个? 这听起来像是很多内存开销,但会保持一切的分离。
我应该只有一个 GLOBALS 表,还是每个对象都有一个,可以在调用成员之前放置它?这似乎会最小化一些类决定使用全局变量,另一个不小心覆盖它的机会,但比拥有多个 lua_States 的内存开销要小。
或者我应该将所有内容全部放在一个全局表中?
另一个问题涉及 Lua 代码本身。有两种策略……首先将所有类定义都放在一个地方,加载它们时应用程序启动;其次,对于每个文件只放置一个类定义,并在需要实例化它时简单地确保该文件已加载。
我很感激任何人的想法,谢谢。
原文链接 https://stackoverflow.com/questions/1395933
虽然LuaBind非常精巧和方便,但当你的引擎变得越来越庞大,编译时间也会急剧增长。
如果你已经有或者打算添加消息系统(我强烈推荐,特别是网络方面),那么这会显著简化问题。在这种情况下,你只需要绑定几个关键函数,以便与消息系统进行接口交互。这将使你的编译时间缩短,并让你拥有一个非常灵活的系统。
由于你正在进行面向组件的引擎开发(顺便说一句,这是个好选择),因此将脚本作为对象组件进行集成更为合理。这种情况下,通常应该将每个脚本组件作为一个新的协程来运行每个特定对象的行为。你不需要过多地担心内存问题,Lua状态非常轻量化,如果将内存管理器与Lua进行接口,可以使其运行速度更快。
如果将脚本作为组件实现,仍然有必要加载全局或每个关卡的脚本(用于协调其他对象的事件触发,或者可能是敌人生成计时器)。
关于加载脚本,一次性加载关卡所需脚本并将其保存在全局表中以方便快速访问也不是坏习惯。加载Lua脚本非常快速,特别是如果对其进行预编译。
就 Lua 代码而言,我建议在应用启动时加载所有内容(除非您确实需要按需 “惰性” 加载核心类)。这通常简化了维护和调试。而在加载了不再需要的代码的情况下,垃圾回收器会很快清理它们。 :-)
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
一项考虑是如何分配线程。
如果你想要同时运行两个游戏对象的代码,那么它们应该有各自独立的 lua_States,以便它们可以同时运行。当然,这也意味着它们在除了 C 代码之外不能共享任何状态(在 C 代码中仍需注意线程安全性)。