用于音效的AS3对象池

时间:2011-11-01 17:07:48

标签: actionscript-3 optimization soundpool object-pooling

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

这个小脏解决方案会检查我们借用的项目是否与我想要创建的声音相同。如果它是相同的声音,我不会再次创建声音。如果不是,即使我知道池中存在正确的声音,我也会创建它。

var item : ISoundItem = _soundPool.checkOut();

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

这个肮脏的解决方案已将我的实例减少到大约七个实例,但我认为我可以进一步优化它。

我一直在考虑将声音名称传递给结帐功能,但是每次在游泳池中循环是否真的值得?

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

在这种情况下按姓名致电不会受到处罚。但是,您可能希望确保您的类只允许将实现ISoundItem的对象添加到您的Dictionary中。

此实现取决于您使用声音的频率。如果你不经常使用它们,这可能会正常工作。如果它们声音很长或者你很快就使用它们,你可能会考虑做一个数组字典或类似的东西。