声音效果的AS3对象池

问题描述:

我正在构建一款游戏,我需要*处理器很多声音效果。我创建了一个对象池,以便能够重用它们的效果。我的问题是我应该如何编写一个漂亮的游泳池解决方案,而不必为每种声音类型创建一个池。池的结帐功能返回列表中的第一个声音。声音效果的AS3对象池

这个有点肮脏的解决方案检查我们借用从池中的项目是否有我想要创建的相同声音。如果它是相同的声音,我不会再创造声音。如果不是这样,即使我知道游泳池中存在正确声音的实例,我也会创建它。

var item : ISoundItem = _soundPool.checkOut(); 

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

这肮脏的解决方案减少了我的情况下,以约七实例被数百名,但我想我可以更加优化。

我一直在考虑将声音名称传递给结帐功能,但真的值得每次循环访问池吗?

任何想法?

如果您正在寻找快速查找并且您有许多不同的声音,则可以考虑使用Dictionary对象来保存声音引用而不是Vector或Array。字典不会使用迭代进行查找 - 它始终是一对一的。你会这样做:

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

在这种情况下通过名称调用将没有处罚。不过,你会想确保你的类只允许实现ISoundItem的对象被添加到你的Dictionary中。

该实现取决于您使用声音的频率。如果你不经常使用它们,这可能会正常工作。如果它们声音很长,或者使用得非常快,则可以考虑制作一个数组字典或其他类似的字典。

+0

效果经常播放,这意味着游泳池将有重复。 – Mattias

+0

@Mattias嗯。我可能会发现一些黑客,但如实地说,可能有一个特定的数据结构可以满足您的需求。不过,就我而言,我会推荐一个特定项目的数组字典或一个链接列表字典。 –

+0

嗯。毕竟,这可能是最好的方法。我会尝试使用包含Vectors的字典。谢谢。 – Mattias