0

我正在开发一款需要顶级音效的游戏。我为效果创建了一个对象池,以便能够重用它们。我的问题是我应该如何编写一个不错的池解决方案,而不必为每种声音类型创建一个池。pool 的 checkout 函数返回列表中的第一个声音。

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

var item : ISoundItem = _soundPool.checkOut();

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

这个肮脏的解决方案已将我的实例从数百个实例减少到大约七个实例,但我认为我可以对其进行更多优化。

我一直在考虑将声音名称传递给结帐功能,但是每次都必须遍历池真的值得吗?

有任何想法吗?

4

1 回答 1

1

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

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

在这种情况下,直呼姓名不会受到处罚。不过,您需要确保您的类只允许将实现 ISoundItem 的对象添加到您的 Dictionary 中。

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

于 2011-11-01T17:27:26.540 回答