Lua的游戏引擎多线程

时间:2015-09-10 05:05:10

标签: c++ multithreading lua

我正在为我的游戏引擎设计线程架构,而且我已经达到了难以接受的程度。

该引擎部分受到了Grimrock引擎的启发,他们尽可能多地将这些引擎放入LuaJIT,其中包括一些用C ++编写的低级系统。

这似乎是一个很好的计划,因为LuaJIT易于使用,我可以继续在C ++中添加API函数并进一步扩展它。更快的迭代很好,能够在运行时附加到游戏并编辑代码的自定义IDE是一个有趣的选项,从Lua序列化也很容易。

但我对如何添加线程感到困惑。我知道Lua有协同程序,但这不是真正的线程;它基本上是为了让Lua在等待代码花费太长时间时停止运行。

我最初的想法是让主线程在Lua中运行并调用派送到调度程序的C ++函数,但是我无法找到有关Lua如何运行的足够信息。我知道当Lua调用C ++函数时它会在状态之外运行,所以理论上它可能

我也不知道,如果Lua打出一个不应该返回任何内容的电话,它将挂在该函数上直到它完成。

我不确定任务调度程序是在主线程中运行,还是只是所有工作线程都从队列中提取数据。

基本上意味着,它不是一次运行所有内容,而是在做任何事情之前等待游戏状态更新。

有没有人对线程有任何想法或建议?

1 个答案:

答案 0 :(得分:1)

通常,单个lua_State *不是线程安全的。它是用纯C编写的,意味着速度非常快。允许异常通过它也是不安全的。那里没有锁,没有办法保护自己。

如果要在不同的线程中同时运行多个lua脚本,最直接的方法是在每个线程中单独使用luaL_newstate(),初始化每个脚本,并在每个线程中加载和运行脚本。只要您的回调在必要时使用锁定,他们就可以安全地与C ++通信。至少,我会尝试这样做。

你可以采取各种措施加快速度,例如,如果要在每个线程中加载单个脚本的副本,可以在启动任何线程之前将其编译为lua字节码,然后放入将缓冲区放入共享内存,并让脚本加载共享字节代码而不进行更改。根据您的应用,这很可能是不必要的优化。