2009-06-26 45 views
0

我有一個字符數組對象(擴展雪碧)。從數組中重用元素的最佳方法?

public static var charlist:Array; 

當一個角色死了,我設置一個標誌,以指示。

char.die = true; 

當我生成一個新的球員,我對證此標誌,重用插槽。這是問題出現的地方。 這樣做的最好方法是什麼?其實我有這種方法:

char = new Char(); 
/* ... */ 
for (var i:Number = 0; i < Char.charlist.length; i++) { 
    if (Char.charlist[i].death) { 
     Char.charlist[i] = char; 
     return; 
    } 
} 

但問題是,我來自C + +,我認爲每次迭代計算索引是浪費。
我會做到這一點,但是這在AS3中不工作,因爲我不能引用訪問項目:

char = new Char(); 
/* ... */ 
for (var i:Number = 0; i < Char.charlist.length; i++) { 
    var char_it:Char = Char.charlist[i]; 
    if (char_it.death) { 
     char_it = char; 
     return; 
    } 
} 

剛一說明:charlist是煤焦類的靜態成員。

你有什麼想法或更好的方法嗎?

謝謝!

回答

2

的「優化「我認爲,版本並沒有優化太多。

Y我們的代碼在每次迭代中不執行2次訪問。它只是當你碰巧找到一個死的Char;之後你回來。所以,我認爲沒什麼大不了的。

就個人而言,我不認爲重新使用陣列插槽會產生很大的差異。而且,也許它可能會降級(但最糟糕的部分是如果你避免它,你的代碼可能會更簡單)。假設你有100個字符,其中60個已經死了,並且你有一個循環運行每一幀,並對每個活字符執行一些檢查/操作。你會循環超過100個字符,當你可以循環40個以上時,如果你維護了一個活的對象列表和一個死對象列表,準備重用它們。此外,「死亡列表」可以作爲堆棧來處理,因此不需要迭代來獲取字符。

不管怎麼說,我看到兩個東西,你可以很容易地優化你的代碼:

1)檢索外循環列表長度:

這樣做:

var len:int = Char.charlist.length; 
for (var i:Number = 0; i < len; i++) { 

取而代之的是:

for (var i:Number = 0; i < Char.charlist.length; i++) { 

編譯器不會優化掉長度的調用(遵循ecmasc ript spec)。

2)避免靜態訪問(對於charlist)。已知它比實例訪問慢得多。

編輯:

重讀你的問題,我知道我誤解了它的一部分。你不是試圖重複使用Char對象,而是使用數組槽。不過,我不認爲重新使用數組槽是值得的(Actionscript中的數組是不固定的);但是可以幫助性能的東西是重用Char對象本身。重新設置一個Sprite通常比創建一個新的更便宜。 你可以用一堆「死」的物體來管理這個物體,你可以從中取出一個物體,並在需要時將其「恢復原狀」,而不是創建一個新物體。有關對象池

這篇文章談判(該博客本身是ActionScript的東西的良好來源,尤其是對性能和數據結構的主題,值得看一看):

http://lab.polygonal.de/2008/06/18/using-object-pools/

+0

大文件,我來的時候回到那個項目,我會查看這個信息。 – Veehmot 2009-07-05 04:14:09

0

爲什麼不使用列表而不是數組,只需從列表中刪除死亡列表並在需要時添加新列表?
是否有充分的理由嘗試重用該插槽?
你想優化什麼?

0

是否有理由不能拼接出所需的字符並將新字符推送到數組上?

var characters:Array = ["leo", "raph", "don", "mike"]; 
characters.splice(1, 1); 
trace(characters); 
characters.push("splinter"); 
trace(characters); 

如果你被引用在尋找存儲,結賬AS3的Dictionary對象,甚至是Flash 10的載體(如存儲是類型相一致;相當快):

http://www.gskinner.com/blog/archives/2006/07/as3_dictionary.html

相關問題