Lua协程错误:试图跨越metamethod/C-call边界

use*_*521 4 lua

我正在使用一个允许你在Lua中编程的游戏引擎.游戏引擎命令位于从C创建的DLL中.在C中创建了一个调用Lua文件的exe.这个Lua文件是您放置所有游戏代码的地方,包括主循环.没有与exe来回,但你可以从DLL调用函数.

所以在主循环之前我创建了一个函数,我将创建一个协程.这个函数遍历一个非常大的表,所以我产生的每n次迭代.这个函数有一个无限的while循环,因为我需要这些东西来运行主游戏循环的每个循环,但如果它在多个循环之间分割就没关系.

然后我创建一个以此函数作为参数的协同程序.在主游戏循环中,我然后恢复这个协程.

当我运行我的代码时,我得到错误:触发跨越元方法/ C调用边界

我正在网上阅读一些内容,但并不是真正理解这里的问题.一旦exe调用Lua文件,它就不会返回到exe文件,直到Lua文件完成,并且由于我在Lua文件中有我的主循环,它在我的测试用例中永远不会完成.

那么我有什么选择呢?

Nic*_*las 8

该错误告诉您,您正试图从Lua代码中产生Lua代码执行让步的Lua代码和恢复协程的Lua代码之间存在一些C函数.要发现这个错误,你必须要做的就是从Lua调用一些C函数,然后调用Lua代码然后调用coroutine.yield().

你不能这样做.您必须重新构建代码以避免这种情况.由于您没有提供任何代码,因此没有太多建议.


Mic*_*man 6

如果您无法更改代码以避免 C/元方法边界,您可以做几件事:

  • 如果您正在使用标准 Lua,并且正在自己编译它,请尝试使用Coco — True C Coroutines for Lua修补它。

    真正的 C 协程语义意味着您可以跨越 C 调用边界从协程让出并恢复到它。

  • 尝试使用LuaJIT而不是标准的 Lua 解释器。它使用完全可恢复的 VM,这意味着边界不是问题。

  • 尝试使用Lua 5.2。它具有可屈服的 pcall 和元方法,这意味着它可以处理您的问题。但是,Lua 5.1 和 Lua 5.2 之间存在一些变化和不兼容。