我正在使用C / C ++游戏中的lua 5.3来编写其行为的某些部分。
在C ++程序中,我以以下方式调用lua函数main
的每一帧:
lua_getfield(VMState, LUA_GLOBALSINDEX, "main");
int result = lua_pcall(VMState, 0, 0, 0);
我希望脚本定义一个名为main
的函数,该函数可以完成很多工作。例如,我可以使用一个脚本来执行以下操作:
local f = function()
draw_something({visible = true, x = 0, y = 0})
end
main = function()
f()
end
draw_something()
是C代码的回调,它对传递的参数做了一些有趣的事情:
lua_getfield(VMState, 1, "visible");
bool visible = (bool)lua_toboolean(VMState, 2); lua_pop(VMState, 1);
if (!visible)
return;
// Do some other stuff
有趣的是,在调用此回调时,我作为参数传递给lua端的do_something
的匿名表现在位于堆栈位置1,因此我可以调用{{1} },然后访问lua_getfield()
字段并对其进行处理。
这很好用,多年来我已经做了很多类似的事情。
现在,我想将lua调用转换为"visible"
到协程,因此我从lua方面执行以下操作:
f
结果应相同。但是,现在发现,通过将调用移至协程内部的local f = function()
draw_something({visible = true, x = 0, y = 0})
end
local g = coroutine.create(function()
while true do
f()
coroutine.yield()
end
end
main = function()
coroutine.resume(g)
end
,我传递给该函数的参数(应该是一个表)现在是线程了吗? (draw_something()
返回0,而lua_istable()
返回1)。
有趣的是,向回调函数传递多少个参数无关紧要:0、1、4、50,从回调内部我只得到一个参数,它是一个线程。
由于某种原因,这是我导出的某些功能(并非全部)发生的。我在导出不同功能的方式上看不出任何差异。
lua是否有理由将我的参数切换到线程?
答案 0 :(得分:3)
我找到了答案。
事实证明,在lua_State
上传递给您的lua_CFunction
与在lua_newstate()
上获得的lua_State
不能保证相同
我想每个协程可能都有自己的独立lua_State
。如果您总是在lua_newstate()
上使用lua_State
进行操作,那么协程可能会出现问题,因此必须确保始终使用{{1 }}。