gpt4 book ai didi

c++ - 使用 Lua 的游戏引擎多线程

转载 作者:行者123 更新时间:2023-11-28 06:05:19 25 4
gpt4 key购买 nike

我正在为我的游戏引擎设计线程架构,但我遇到了困难。

该引擎的部分灵感来自 Grimrock 的引擎,他们将尽可能多的东西放入 LuaJIT 中,其中一些东西(包括低级系统)是用 C++ 编写的。

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

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

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

我也不知道,如果 Lua 进行了这样一个不应该返回任何东西的调用,它是否会挂起函数直到它完成。

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

基本上意味着,它不是立即运行所有内容,而是在执行任何操作之前等待游戏状态更新。

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

最佳答案

一般来说,单个lua_State * 不是线程安全的。它是用纯 C 语言编写的,运行速度非常快。允许异常通过它也不安全。那里没有锁,它无法保护自己。

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

你可以做很多事情来加速它,例如,如果你在每个线程中加载一个脚本的拷贝,你可以在启动任何线程之前将它编译成 lua 字节码,然后把缓冲区到共享内存,并让脚本加载共享字节码而不改变。不过,这很可能是不必要的优化,具体取决于您的应用。

关于c++ - 使用 Lua 的游戏引擎多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32493539/

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