Найти базовый SoundEffect для SoundEffectInstance в C# WP7
WP7 подвергается довольно серьезным штрафам за производительность, когда воспроизводится слишком много звуков. У меня есть AudioManager, который отслеживает SoundEffectInstances и предотвращает одновременное воспроизведение слишком большого количества файлов.
Однако некоторые вещи не требуют экземпляра и просто вызывают Play() для самого SoundEffect. Например, пуля воспроизводит ударный звук, когда поражает что-то, но на самом деле не нуждается в экземпляре.
Моя текущая система управляет только экземплярами. Что я хотел бы сделать, так это посмотреть, есть ли у меня в наличии существующий экземпляр этого SoundEffect, который не используется, и просто воспроизвести его. Для этого потребуется найти тип SoundEffect для SoundEffectInstance, проверить, воспроизводится ли он, а затем воспроизвести его, если нет. Это позволит мне более точно отслеживать общее количество воспроизводимых звуков.
Надеюсь, это имеет смысл, и кто-то может направить меня в правильном направлении.
1 ответ
Важно решить, как вы собираетесь управлять количеством играющих SoundEffectInstances
однажды? Очевидный способ - изменить код игрового процесса (или уровни, или что-то еще) так, чтобы количество игровых звуков просто никогда не становилось слишком большим.
Но если это неприемлемо, вам нужно каким-то образом установить жесткий лимит. И вопрос: как ты собираешься это сделать? Будет ли у каждого звукового эффекта максимальное количество экземпляров этого эффекта? Или у вас будут "классы звука" (где класс имеет максимальное количество игр)? Или просто общее максимальное количество звука? Будет ли ограничение введено путем предотвращения воспроизведения дополнительных звуков? Или путем отключения звуков, которые уже играют?
Я хотел бы предложить создать объект-оболочку вокруг SoundEffect
который реализует почти то же самое, что SoundEffect.Play
делает (это внутренне управляет пулом SoundEffectInstance
s, повторное использование их, когда они закончили играть). Затем добавьте функциональность шапки воспроизведения поверх него.
Так что ваш класс-обертка может выглядеть примерно так:
class MySoundEffect
{
SoundEffect sound;
List<SoundEffectInstance> instances;
int maxInstances;
}
Или, возможно, так:
class MySoundEffect
{
static int[] soundClassMaximums = { 2, 2, 5, 10 };
static int[] soundClassInstanceCount;
SoundEffect sound;
List<SoundEffectInstance> instances;
int class;
}
И тогда вы будете использовать MySoundEffect
везде, где вы обычно используете SoundEffect
,
Взгляните на ExEn. Потому что он реализует внутренние SoundEffect
Вы можете позаимствовать его код пула, который похож на настоящий XNA SoundEffect
делает, а затем использовать его в качестве отправной точки для вашего собственного пула экземпляров с добавленной функциональностью.
Есть и другие способы сделать это, и это будет зависеть от вашей архитектуры. Но в основном это зависит от вас, чтобы отслеживать связь между звуковыми эффектами и экземплярами. Нет никакого способа сделать это в API XNA (если не считать некоторых неприятных размышлений).