Найти базовый SoundEffect для SoundEffectInstance в C # WP7 - PullRequest
1 голос
/ 27 июня 2011

WP7 подвергается довольно серьезным штрафам за производительность, когда воспроизводится слишком много звуков.У меня есть AudioManager, который отслеживает SoundEffectInstances и предотвращает одновременное воспроизведение слишком большого количества файлов.

Однако некоторые вещи не требуют экземпляра и просто вызывают Play () для самого SoundEffect.Например, пуля воспроизводит ударный звук, когда поражает что-то, но в действительности не нуждается в экземпляре.

Моя текущая система управляет только экземплярами.Что я хотел бы сделать, так это посмотреть, есть ли у меня в наличии существующий экземпляр этого SoundEffect, который не используется, и просто воспроизвести его.Для этого потребуется найти тип SoundEffect для SoundEffectInstance, проверить, воспроизводится ли он, а затем воспроизвести его, если нет.Это позволит мне более точно отслеживать общее количество воспроизводимых звуков.

Надеюсь, это имеет смысл, и кто-то может указать мне правильное направление.

1 Ответ

0 голосов
/ 27 июня 2011

Важно решить, как вы собираетесь управлять количеством играющих SoundEffectInstances одновременно?Очевидный способ - изменить код игрового процесса (или уровни, или что-то еще) так, чтобы количество игровых звуков просто никогда не становилось слишком большим.

Но если это неприемлемо, вам нужно каким-то образом установить жесткий лимит.И вопрос: как вы собираетесь это сделать?Будет ли у каждого звукового эффекта максимальное количество экземпляров этого эффекта?Или у вас будут «классы звука» (где класс имеет максимальное количество игр)?Или просто общее максимальное количество звука?Будет ли ограничено использование дополнительных звуков?Или, обрезая звуки, которые уже воспроизводятся?

Я бы предложил создать объект-оболочку вокруг SoundEffect, который реализует почти то же самое, что и SoundEffect.Play (он внутренне управляет пулом * 1008).* 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 (если не считать некоторых неприятных размышлений).

...