我正在开展2D游戏。我在所有游戏逻辑中使用lua脚本。现在的问题是排序太慢了。任何人都可以帮助改善吗?
这是关于zobject list的代码。
local c = class("ZList") -- class is a function to generate a "Class"
function c:insert(v) -- every v(value or object) has a z field
if v.z == nil then v.z = -1 end
if self.head == nil then
self.head = {val=v, nxt=nil}
else
local p = self.head
local pp = p -- pp is a pointer to pre node
while v.z and p and p.val.z and p.val.z <= v.z do
pp = p
p = p.nxt
end
if p == self.head then
self.head = {val=v, nxt=p}
else
pp.nxt = {val=v, nxt=p}
end
end
end
function c:delete(v)
local p = self.head
local pp
while p and p.val ~= v do
pp = p
p = p.nxt
end
if p ~= nil then
if p == self.head then
self.head = p.nxt
else
pp.nxt = p.nxt
end
end
end
___ 更新 __ _ __ _
谢谢Nicol,每一个回复!我按照你的建议:使用table.insert和table.sort,使用一个不需要排序的静态列表。以下是我的最终代码:
local remove_list
sort(Graphics.viewports, comp)
for _, viewport in pairs(Graphics.viewports) do
if viewport.visible then
remove_list = {}
if not viewport.static then sort(viewport.sprites, comp) end
for k, sprite in pairs(viewport.sprites) do
if not sprite:paint() then
table.insert(remove_list,1, k)
end
end
for _, k in pairs(remove_list) do
table.remove(viewport.sprites, k)
end
end
end
答案 0 :(得分:3)
停止将精灵放在链接列表中。将它们放在常规列表中。插入时间不会像内存分配那样严重损害您,而链接列表也会如此。只需使用常规的Lua列表,table.insert
等等。
或者,您真的需要所有精灵都要排序吗?最有可能(当然,取决于具体情况),您可以在图层中绘制它们:所有第0层(按任意顺序),然后是第1层等等。
答案 1 :(得分:1)
为什么不在table.sort
中使用构建?使用它你有2个选项
在调用时指定排序函数:table.sort(table,comp)
,其中comp(a,b)
是一个函数,如果
为您的精灵类实现__lt元方法,实现<
操作。
table.sort
显然使用了快速排序算法的变体(根据lua-users wiki上的LuaSorting)。