Как воспроизвести звук как можно скорее? - PullRequest
5 голосов
/ 06 марта 2012

В моем приложении около 60 сэмплов. Я должен играть с большой точностью во времени. 5 мс будет иметь значение. Звук должен воспроизводиться в ответ на действия пользователя. Поэтому я не знаю, какой звук будет играть дальше. Я много думал о создании SoundEffectInstance для всех звуков. Создание SoundEffectInstance занимает какое-то время и память? Это полная копия SoundEffect в памяти или просто указатель информации. Могу ли я улучшить свое приложение, если я предварительно создаю SoundEffectInstances? Есть ли другой способ воспроизвести семпл как можно скорее в XNA?

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

A SoundEffect содержит фактические данные формы волны.Он использует большой объем памяти (столько, сколько требуется данным формы сигнала).

A SoundEffectInstance - это небольшой объект, содержащий данные о воспроизведении (положение, громкость и т. Д.) И дескриптор для "голос ", который был выделен для воспроизведения.

Когда вы используете SoundEffect.Play, внутренне он создает SoundEffectInstance.Он также может объединять эти экземпляры, поэтому ему не нужно повторно создавать их при последующих вызовах.

Создание SoundEffectInstance занимает некоторое время и память.Для звуковых эффектов в игре с частотой 30 кадров в секунду (33 мс на кадр) задержка должна быть незаметной.


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


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

Тем не менее, если вам нужно как можно лучше уменьшить задержку ввода-вывода, вы можете опрашивать ввод чаще, чем один раз за кадр.И вам все еще следует использовать DSEI.Я не уверен, что DSEI имеет настраиваемый размер буфера воспроизведения, но если это так, вы должны сделать его как можно меньше, не вызывая сбоев звука.

2 голосов
/ 06 марта 2012

Когда пользователь выбирает набор, вы должны загрузить эти звуковые эффекты в словарь, чтобы впоследствии доступ к ним был быстрее.

Однако вам не следует загружать все звуковые эффекты, особенно те, которыеВы не нуждаетесь в определенном экране или наборе.Кроме того, вы должны выгружать звуковые эффекты, которые вам больше не нужны.

Требуется время, чтобы загрузить эти звуковые эффекты, в зависимости от размера и количества, которое вы хотите загрузить.Я бы порекомендовал вам сделать базовый экран загрузки для загрузки / выгрузки контента в вашей игре (большинство игр делают это так).Вы будете загружать звуковой эффект (я полагаю, в формате wav) в память, а не просто указатель, поэтому звуковые эффекты должны быть короткими.

Уже загруженный звуковой эффект будет воспроизводиться очень быстро (задержканезаметно).Предварительная загрузка увеличит производительность приложения за счет использования памяти.

...