我正在使用一个允许你在Lua中编程的游戏引擎。游戏引擎命令位于从C创建的DLL中。在C中创建了一个调用Lua文件的exe。这个Lua文件是您放置所有游戏代码的地方,包括主循环。没有与exe来回,但你可以从DLL调用函数。
所以在主循环之前我创建了一个函数,我将创建一个协程。这个函数遍历一个非常大的表,所以我产生的每n次迭代。这个函数有一个无限的while循环,因为我需要这些东西来运行主游戏循环的每个循环,但如果它在多个循环之间分割就没关系。
然后我创建一个以此函数为参数的协同程序。在主游戏循环中,我然后恢复这个协程。
当我运行我的代码时,我得到错误:诱导产生跨metamethod / C调用边界
我正在网上阅读一些内容,但并不是真正理解这里的问题。一旦exe调用Lua文件,它就不会回到exe文件,直到Lua文件完成,因为我在Lua文件中有我的主循环,它在我的测试用例中永远不会完成。
我对此有何选择?
答案 0 :(得分:8)
错误告诉你,你正试图从Lua代码中产生Lua代码执行屈服的Lua代码和恢复协程的Lua代码之间有一些C函数。要发现这个错误,你必须要做的是从Lua调用一些C函数,然后调用Lua代码,然后调用coroutine.yield()
。
你做不到。您必须重新构建代码以避免这种情况。由于您没有提供任何代码,因此没有太多建议。
答案 1 :(得分:4)
如果您无法更改代码以避免C / metamethod边界,则可以执行以下操作:
如果您使用的是标准Lua,并且正在自行编译,请尝试使用Coco — True C Coroutines for Lua修补它。
真正的C coroutine语义意味着你可以从一个C语言边界的协程中产生并恢复它。
尝试使用LuaJIT而不是标准的Lua解释器。它使用fully resumable VM意味着边界不是问题。
尝试使用Lua 5.2。它具有yieldable pcall and metamethods,这意味着它可以处理您的问题。但是,Lua 5.1和Lua 5.2之间存在一些变化和不兼容。