2012-01-30 56 views
2

數組我試圖預先整理項目的數組使用以下添加到一個數組:預分類在AS3

draw(texture:LTexture, position:Point, depth:int = 0):void 

目前,調用此增加紋理到隊列中。一旦我的隊列中的項目是準備渲染,我用下面的排序我的數組:

queue.sortOn("depth"); 

這工作得很好,但它的速度慢,尤其是當我的隊列中有超過2000紋理繪製。


我試圖通過在draw()中添加一些新的邏輯來預設我的數組。基本上我的隊列現在是一個2D數組,其中第一個圖層表示深度,其中的每個數組都包含要繪製的紋理。例如:

queue[1] = [texture, texture]; 
queue[4] = [texture]; 
queue[2] = [texture, texture, texture, texture]; 

我再有,結合這些數組到一個新的隊列功能:

function collate():Array 
{ 
    var collated:Array = []; 

    for each(var i:Array in _block) 
     collated = collated.concat(i); 

    return collated; 
} 

這似乎是工作正常,但也有一些問題至今:

  1. 當我使用深度變化很大時,例如517,foreach循環似乎在串聯順序爲準它們創建,而不是它們的索引我內心的數組(奇怪 - 如果我用深處更加接近正常工作)。
  2. 如果指定了深度非常高和/或極大地改變,我的隊列結束有空閒時隙的一噸,我的foreach循環將具有串聯我的陣列,例如,當在迭代的過程中包括:,,,,,,,,,,,texture2,texture3,,,,,,texture0,texture1,,,,,texture4

我該如何更好地處理我想要實現的目標?那是,我想結束一個數組包含我的所有紋理按深度排序。

+0

考慮使用載體,以及向量。他們搖滾! – ToddBFisher 2012-01-30 06:38:11

+0

@ToddBFisher我在多個地方讀過'Vector'只有在使用'int','uint','Number'和我認爲'String'時纔會產生好處。 – Marty 2012-01-30 06:40:58

+0

我只對字符串和數字的向量做過測試,所以可能是這種情況。我理解它的方式是,因爲vector只存儲一個數據類型,所以它通常允許它們比數組訪問更快。我至少會試一試。如果你做測試向量,讓我知道,因爲我會對你的對象的速度差異與數組的結果感興趣。 – ToddBFisher 2012-01-30 06:46:32

回答

2

雖然我不能想象一個理由,2000和紋理爲Z排序(看起來像一個可怕的很多),我想出了這些想法:

  1. 使用linked list,而不是一個數組,並且在添加紋理時,紋理會找到它們各自的位置(每個新紋理到第一個節點,然後讓鏈接的節點將其傳遞,直到它到達正確深度的位置)。

    如果您有時間進入鏈接列表,這可能是我選擇的解決方案,因爲它允許您保留現有結構並隨時添加或刪除紋理,而無需再次對整個列表進行排序然後再次。

  2. 您可以將鏈接列表與字典組合:按上述方式創建鏈接列表,並收集對Dictionary中每個深度的第一個節點的引用(node_dictionary[depth] = node;)。這樣,您可以在給定的深度添加()新節點,而不必從列表的開始處傳遞它們。

  3. 使用第二陣列僅收集現有的隊列指數和那種簡單的數組擺脫空槽(每次添加一個紋理裏推指數)。

    var index_array : Array = []; 
    ... 
    queue[17].push(texture); 
    index_array.push (17); 
    ... 
    queue[1].push(texture); 
    index_array.push (1); 
    ... 
    queue[17].push(texture); // probably more than one texture for each index 
    index_array.push (17); 
    
    index_array.sort(Array.NUMERIC|Array.UNIQUESORT); 
    
    var i:int = -1; 
    while (++i < index_array.length) drawTextures(queue[i]); 
    
+0

不知道爲什麼我不考慮鏈接列表 - 謝謝你,你的步驟'2'是一種享受 - 我現在有超過5000個精靈的超級快速渲染。 – Marty 2012-01-30 08:28:33

+0

很高興幫助! :d – weltraumpirat 2012-01-30 09:11:21