-1

我正在开发一个 2d 游戏。我在所有游戏逻辑中都使用 lua 脚本。现在的问题是排序太慢了。任何人都可以帮助改进它吗?

这是我关于 zobject 列表的代码。

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

___ 更新_ _ __ _

谢谢尼科尔,每个人都回复了!我听从了你的建议:使用 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
4

2 回答 2

3

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

或者,您真的需要对所有精灵进行排序吗?最有可能(当然取决于具体情况),您可以将它们分层绘制:所有第 0 层(以任何顺序),然​​后所有第 1 层,等等。

于 2012-06-20T01:57:34.887 回答
1

为什么不使用内置table.sort?使用它你有2个选项

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

  2. 为你的精灵类实现一个 __lt 元方法,实现<操作。

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

于 2012-06-20T05:55:56.997 回答