2011-11-01 96 views
0

我正在構建一款遊戲,我需要頂級處理器很多聲音效果。我創建了一個對象池,以便能夠重用它們的效果。我的問題是我應該如何編寫一個漂亮的游泳池解決方案,而不必爲每種聲音類型創建一個池。池的結帳功能返回列表中的第一個聲音。聲音效果的AS3對象池

這個有點骯髒的解決方案檢查我們借用從池中的項目是否有我想要創建的相同聲音。如果它是相同的聲音,我不會再創造聲音。如果不是這樣,即使我知道游泳池中存在正確聲音的實例,我也會創建它。

var item : ISoundItem = _soundPool.checkOut(); 

if(item.name != name) 
    item.create(name, _soundFactory.create(name), config); 

這骯髒的解決方案減少了我的情況下,以約七實例被數百名,但我想我可以更加優化。

我一直在考慮將聲音名稱傳遞給結帳功能,但真的值得每次循環訪問池嗎?

任何想法?

回答

1

如果您正在尋找快速查找並且您有許多不同的聲音,則可以考慮使用Dictionary對象來保存聲音引用而不是Vector或Array。字典不會使用迭代進行查找 - 它始終是一對一的。你會這樣做:

var item : ISoundItem = _soundPool.checkOut(MySoundA); 
var item : ISoundItem = _soundPool.checkOut(MySoundB); 

在這種情況下通過名稱調用將沒有處罰。不過,你會想確保你的類只允許實現ISoundItem的對象被添加到你的Dictionary中。

該實現取決於您使用聲音的頻率。如果你不經常使用它們,這可能會正常工作。如果它們聲音很長,或者使用得非常快,則可以考慮製作一個數組字典或其他類似的字典。

+0

效果經常播放,這意味着游泳池將有重複。 – Mattias

+0

@Mattias嗯。我可能會發現一些黑客,但如實地說,可能有一個特定的數據結構可以滿足您的需求。不過,就我而言,我會推薦一個特定項目的數組字典或一個鏈接列表字典。 –

+0

嗯。畢竟,這可能是最好的方法。我會嘗試使用包含Vectors的字典。謝謝。 – Mattias