2012-03-06 18 views
5

Hay alrededor de 60 muestras de sonido en mi aplicación. Tengo que jugarlo con gran precisión en el tiempo. 5 ms será mater. El sonido debe reproducirse en respuesta a las acciones del usuario. Así que no sé qué sonido tocará a continuación. Pensé en hacer una preproducción de SoundEffectInstance para todos los sonidos. ¿La creación de SoundEffectInstance toma tiempo y memoria? ¿Es una copia completa de SoundEffect en la memoria o solo información del puntero? ¿Puedo mejorar mi aplicación si voy a precreate SoundEffectInstances? ¿Hay alguna otra forma de reproducir muestras lo más pronto posible en XNA?¿Cómo se reproduce el sonido lo antes posible?

+0

¿Necesita todos los sonidos en cualquier momento en la aplicación, o hay sonidos asignados para pantallas diferentes? – Msonic

+0

Pocos conjuntos por 60 sonidos.El usuario elige establecer, entonces puede haber algún sonido del conjunto – xander27

Respuesta

3

A SoundEffect contiene los datos de forma de onda reales. Utiliza una gran cantidad de memoria (tanto como los datos de forma de onda lo requieren).

A SoundEffectInstance es un objeto pequeño que contiene datos sobre la reproducción (posición, volumen, etc.) y un identificador de la "voz" que se ha asignado para hacer la reproducción.

Cuando utiliza SoundEffect.Play, internamente crea un SoundEffectInstance. También puede agrupar estas instancias, por lo que no necesita recrearlas en llamadas posteriores.

Crear un SoundEffectInstance lleva algo de tiempo y memoria. Para los efectos de sonido en un juego que se ejecuta a 30FPS (33ms por cuadro) la latencia involucrada debe ser imperceptible.


Si usted está tratando de reproducir la música secuenciada mediante la mezcla de diferentes efectos de sonido, donde las cosas aún 5ms, que necesita para implementar su propio mezclador de audio usando DynamicSoundEffectInstance. Esto asegurará que los sonidos se sincronicen hasta la muestra.


Si usted está tratando de crear una especie de tiempo real practicable "instrumento", y que está tratando de obtener su latencia de entrada a salida de hasta 5 ms - a continuación, dar ahora. 5 ms es absurdamente bueno y normalmente requiere un equipo especializado y software.

Aún así, si necesita reducir la latencia de entrada a salida lo mejor que pueda, puede sondear la entrada con más frecuencia que una vez por fotograma. Y aún debes usar DSEI. No estoy seguro de si DSEI tiene un tamaño configurable de búfer de reproducción, pero si lo hace, debe hacerlo lo más pequeño posible sin introducir glitches de audio.

2

Cuando un usuario elige un conjunto, debe cargar esos efectos de sonido en un diccionario, por lo que acceder a ellos será más rápido más adelante.

Sin embargo, no debe cargar todos los efectos de sonido, especialmente aquellos que no necesita en una determinada pantalla o conjunto. Además, debes descargar los efectos de sonido que ya no necesitarás.

Lleva cierto tiempo cargar esos efectos de sonido, dependiendo del tamaño y la cantidad que desee cargar. Te recomiendo que hagas una pantalla de carga básica para cargar/descargar contenido en tu juego (la mayoría de los juegos lo hacen de esa manera). Estará cargando el grave efecto (¿formato wav, supongo?) En la memoria, no solo un puntero, por eso los efectos de sonido deben mantenerse cortos.

Un efecto de sonido ya cargado se reproducirá muy rápido (el retraso es imperceptible). La carga previa aumentará el rendimiento de la aplicación, a expensas del uso de memoria.

+0

. ¿Necesitaré precargar el objeto SoundEffectIstance para cada sonido o solo SoundEffect? – xander27

+1

Encontré allí [enlace] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffect.aspx) que ** "Todos los objetos SoundEffectInstance creados a partir de un recurso compartido de SoundEffect recursos "**. Entonces puedo crear cualquier cantidad de 'SoundEffectInstance' – xander27

Cuestiones relacionadas