【发布时间】:2019-06-07 01:57:51
【问题描述】:
我正在使用我的 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,因此我可以从 C 调用 lua_getfield()侧,访问"visible" 字段,并对其进行处理。
这很好用,多年来我已经做了很多这样的事情。
现在,我想把对f的lua调用转换成协程,所以我从lua端做这样的事情:
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(),我传递给函数的参数,本来应该是一个表,现在是一个线程? (lua_istable() 返回 0,而lua_isthread() 返回 1)。
有趣的是,我向函数传递多少个参数并不重要:0、1、4、50,从回调内部我只得到一个参数,它是一个线程。
由于某种原因,我导出的一些函数会发生这种情况,但不是全部。不过,我看不出导出不同函数的方式有什么不同。
lua 是否有任何理由将我的参数切换到线程?
【问题讨论】:
-
为什么要编写 C++/C ?这里没有C++/C这行代码,下次只写LUA
-
@SkillerDz:第一块和第三块代码是C/C++,异常行为发生在C/C++端。
-
你是否使用选项
-DLUA_USE_APICHECK构建了 LuaJIT? -
@EgorSkriptunoff:我不知道那个标志。我正在使用 msvcbuild.bat,所以我将 /DLUA_USE_APICHECK 添加到 LJCOMPILE,并重新构建了游戏。我没有得到任何断言或控制台输出。我把它改成了/DLUA_USE_ASSERT,也没有