背景
我与 Watusimoto 合作开发游戏Bitfighter。我们使用 LuaWrapper 的变体将我们的 c++ 对象与游戏中的 Lua 对象连接起来。我们还使用 Lua 的一种变体,称为lua-vec来加速向量运算。
我们一直在努力解决一段时间以来一直困扰我们的错误。将发生随机崩溃,表明元表已损坏。请参阅此处了解 Watusimoto 关于该问题的帖子。我不确定这是因为元表损坏,并且看到了一些我想在这里问的非常奇怪的行为。
问题表现
例如,我们创建一个对象并将其添加到这样的级别:
t = TextItem.new()
t:setText("hello")
levelgen:addItem(t)
但是,游戏有时(并非总是)会崩溃。出现错误:
attempt to call missing or unknown method 'addItem' (a nil value)
使用在回答上述 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
这会打印出元表,以了解levelgen
从其中调用方法时出错的情况。
然而,这很疯狂,当它失败并打印出元表时,元表正是它应该的样子(通过正确的addItem
调用和一切)。如果我在脚本加载时打印元表levelgen
,并且当它使用pcall
上面失败时,它们是相同的,每个调用和指向 userdata 的指针都是相同的并且应该是相同的。
就好像元表levelgen
是随机地自发消失一样。
有人知道发生了什么吗?
谢谢
注意:这不仅仅发生在levelgen
对象上。例如,它也发生在TestItem
上面提到的对象上。实际上,相同的代码在我的计算机上levelgen:addItem(t)
崩溃了,但在另一个开发人员的计算机上崩溃了,t:setText("hello")
并且出现了相同的错误消息missing or unknown method 'setText' (a nil value)