-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)

  2. スプライト クラスに __lt メタメソッドを実装し、<操作を実装します。

table.sort明らかに、クイックソート アルゴリズムの変形を使用しています ( lua-users wiki のLuaSortingによると)。

于 2012-06-20T05:55:56.997 に答える