Пул объектов AS3 для звуковых эффектов

Я создаю игру, в которой мне нужно много звуковых эффектов. Я создал пул объектов, чтобы эффекты могли использовать их повторно. Моя проблема заключается в том, как мне написать хорошее решение для пула, не создавая пул для каждого типа звука. Функция проверки пула возвращает первый звук в списке.

Это маленькое грязное решение проверяет, имеет ли элемент, который мы заимствуем из пула, тот же звук, который я хочу создать. Если это тот же самый звук, я не создаю звук снова. Если это не так, я создаю его, даже если знаю, что в пуле есть экземпляры правильного звука.

var item : ISoundItem = _soundPool.checkOut();

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

Это грязное решение сократило число моих экземпляров с сотен до семи, но я думаю, что смогу оптимизировать его еще больше.

Я думал передать имя звука в функцию проверки, но действительно ли стоит каждый раз перебирать пул?

Любые идеи?


person Mattias    schedule 01.11.2011    source источник


Ответы (1)


Если вы ищете быстрый поиск и у вас много разных звуков, вы можете рассмотреть возможность использования объекта Dictionary для хранения звуковых ссылок вместо вектора или массива. Словари не используют итерации для поиска — это всегда один к одному. Вы бы сделали что-то вроде этого:

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

Обращение по имени в этом случае не будет иметь штрафа. Однако вы хотели бы убедиться, что ваш класс разрешает добавлять в ваш словарь только объекты, реализующие ISoundItem.

Эта реализация зависит от того, как часто вы используете звуки. Если вы не используете их часто, это, вероятно, будет работать нормально. Если это длинные звуки или вы используете их очень быстро, вы можете подумать о создании словаря массивов или чего-то в этом роде.

person jedd.ahyoung    schedule 01.11.2011
comment
Эффекты воспроизводятся часто, а это значит, что в пуле будут дубликаты. - person Mattias; 01.11.2011
comment
@ Маттиас Хм. Я, вероятно, мог бы найти некоторые хаки вокруг этого, но, честно говоря, вероятно, есть определенная структура данных, которая делает то, что вы ищете. Однако в вашем случае я бы рекомендовал словарь массивов для определенных элементов или словарь связанных списков. - person jedd.ahyoung; 01.11.2011
comment
Хм. Может быть, это лучший подход в конце концов. Я попробую использовать словарь, содержащий векторы. Спасибо. - person Mattias; 01.11.2011
comment
@Mattias Извините, я не могу больше помочь. Я чувствую, что, вероятно, существует структура данных, которая действительно делает то, что вам нужно, но у меня недостаточно знаний о структурах данных, чтобы действительно помочь вам в этом. Хотел бы я, хотя. AS3 может не иметь оптимального типа данных изначально, но я думаю, что есть некоторые внешние библиотеки, которые предоставляют другие типы данных. - person jedd.ahyoung; 02.11.2011
comment
@Mattias Это также может помочь просмотреть некоторые типы данных - здесь есть раздел о мультикартах. en.wikipedia.org/wiki/Multimap - person jedd.ahyoung; 02.11.2011