Lua协程错误:试图跨越元方法/ c调用边界



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

在主循环之前,我创建了一个函数,我将从中创建一个协程。这个函数在一个非常大的表上迭代,所以每n次迭代就会产生一个结果。这个函数有一个无限while循环因为我需要这些东西来运行主游戏循环的每一个循环,但如果它被分割成多个循环也是可以的。

然后以这个函数作为参数创建一个协程。在主游戏循环中,我将继续执行此协同程序。

当我运行我的代码时,我得到错误:tempt to yield across metmethod/C-call boundary

我在网上读了一些东西,但没有真正理解问题在这里。一旦exe调用Lua文件,在Lua文件完成之前,它根本不会返回到exe,并且由于我在Lua文件中有主循环,因此它在我的测试用例中永远不会完成。

那么我有什么选择呢?

该错误告诉您,您正在尝试从Lua代码中生成,其中在执行生成的Lua代码和恢复协同例程的Lua代码之间存在一些C函数。为了出现这个错误,你必须从Lua中调用一些C函数,该函数调用Lua代码,然后调用coroutine.yield()

你不能那样做。相反,您必须重构代码以避免这种情况。由于您没有提供任何代码,因此可以提供的建议不多。

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

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

    真正的C协程语义意味着你可以从一个协程跨C调用边界产生并恢复到它。

  • 尝试使用LuaJIT代替标准的Lua解释器。它使用一个完全可恢复的虚拟机,这意味着边界不是问题。

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

最新更新