背景
我和Watusimoto在Bitfighter游戏上合作.我们使用LuaWrapper的变体将我们的c ++对象与游戏中的Lua对象连接起来.我们还使用称为lua-vec的Lua变体来加速向量操作.
我们一直在努力解决一段时间没有找到错误的bug.将发生随机崩溃,表明腐败的元数据.有关Watusimoto的帖子,请参阅此处.我不确定这是因为一个腐败的metatable,并且看到了一些我想在这里问的非常奇怪的行为.
问题表现形式
作为一个例子,我们创建一个对象并将其添加到这样的级别:
t = TextItem.new()
t:setText("hello")
levelgen:addItem(t)
Run Code Online (Sandbox Code Playgroud)
但是,游戏有时会(并非总是)崩溃.出错:
attempt to call missing or unknown method 'addItem' (a nil value)
Run Code Online (Sandbox Code Playgroud)
使用上面提到的Watusimoto帖子中给出的建议,我已将最后一行更改为以下内容:
local ok, res = pcall(function() levelgen:addItem(t) end)
if not ok then
local s = "Invalid levelgen value: "..tostring(levelgen).." "..type(levelgen).."\n"
for k, v in pairs(getmetatable(levelgen)) do
s = s.."meta "..tostring(k).." "..tostring(v).."\n"
end
error(res..s)
end
Run Code Online (Sandbox Code Playgroud)
这打印出metatable,levelgen如果错误的话从它调用一个方法.
然而,这很疯狂,当它失败并打印出metatable时,metatable 正是应该如何(使用正确的addItem调用和所有内容).如果我levelgen在脚本加载时打印metatable ,并且在上面使用它时失败pcall,它们是相同的,每个调用和指向userdata的指针是相同的,应该是它.
好像metatable levelgen是随意地自发消失的.
有谁会知道发生了什么?
谢谢
注意:仅在levelgen对象中不会发生这种情况.例如,它也发生在TestItem上面提到的对象上.事实上,同样的代码在我的计算机上levelgen:addItem(t)崩溃但在另一个开发人员的计算机上崩溃,并且该行t:setText("hello")具有相同的错误消息missing or unknown method 'setText' (a nil value)