如何使用lua快速排序2d游戏中的精灵?

时间:2012-06-20 01:52:07

标签: sorting lua

我正在开展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

2 个答案:

答案 0 :(得分:3)

停止将精灵放在链接列表中。将它们放在常规列表中。插入时间不会像内存分配那样严重损害您,而链接列表也会如此。只需使用常规的Lua列表,table.insert等等。

或者,您真的需要所有精灵都要排序吗?最有可能(当然,取决于具体情况),您可以在图层中绘制它们:所有第0层(按任意顺序),然​​后是第1层等等。

答案 1 :(得分:1)

为什么不在table.sort中使用构建?使用它你有2个选项

  1. 在调用时指定排序函数:table.sort(table,comp),其中comp(a,b)是一个函数,如果

  2. 则返回true
  3. 为您的精灵类实现__lt元方法,实现<操作。

  4. table.sort显然使用了快速排序算法的变体(根据lua-users wiki上的LuaSorting)。