plano - ¿Qué usas para reproducir el sonido en los juegos de iPhone?
escuchar youtube en segundo plano iphone (5)
Tengo un juego para iPhone con alto rendimiento al que me gustaría agregar sonidos. Parece que hay tres opciones principales: (1) AVAudioPlayer
, (2) Audio Queues y (3) OpenAL. Odiaría escribir páginas de código de bajo nivel solo para reproducir una muestra, por lo que me gustaría usar AVAudioPlayer
. El problema es que parece matar el rendimiento: he hecho una medición simple usando CFAbsoluteTimeGetCurrent
y el mensaje de play
parece tardar de 9 a 30 ms en finalizar. Eso es bastante miserable, teniendo en cuenta que 25 ms == 40 fps.
Por supuesto, está el método prepareToPlay
que debería acelerar las cosas. Es por eso que escribí una clase simple que mantiene varios AVAudioPlayer
a su disposición, los prepara de antemano y luego reproduce la muestra con el reproductor preparado. Sin cigarro, aún tarda los ~ 20 ms que mencioné anteriormente.
Tal rendimiento no se puede usar en juegos, entonces, ¿qué utilizas para reproducir sonidos con un rendimiento decente en iPhone? ¿Estoy haciendo algo mal con el AVAudioPlayer
? ¿Tocas sonidos con Audio Queues? (He escrito algo parecido a AVAudioPlayer antes de que saliera 2.2 y me gustaría ahorrar esa experiencia.) ¿Usas OpenAL? En caso afirmativo, ¿hay una forma simple de reproducir sonidos con OpenAL, o tiene que escribir páginas de código?
Actualización: Sí, reproducir sonidos con OpenAL es bastante simple .
¿Desea verificar el almacenamiento en búfer con la implementación que está utilizando? Puede estar relacionado de alguna manera con la demora de 20 ms que estás experimentando. es decir, intente jugar con el tamaño del búfer.
AVAudioPlayer es muy marginal para el audio del juego. Atacar AudioQueue o OpenAL al adaptar uno de los ejemplos es definitivamente el camino a seguir. latencia es mucho más controlable de esa manera.
Si llama a play
en el hilo principal, intente ejecutarlo en un hilo separado. Lo que terminé haciendo es:
#include <dispatch/dispatch.h>
dispatch_queue_t playQueue = dispatch_queue_create("com.example.playqueue", NULL);
AVAudioPlayer* player = ...
dispatch_async(playQueue, ^{
[player play];
});
que solucionó lo peor de la tartamudez de framerate que estaba experimentando.
Usa CocosDenshion , es gratis, fácil y funciona. Envuelve AVAudioPlayer
para pistas de fondo y OpenAL para sonidos.
Utilizo OpenAL y las clases que vienen con el código de ejemplo CrashLanding. Hasta ahora, funcionó bien para reproducir muestras y reproducir música en bucle, todo al mismo tiempo. Actualmente estoy aprendiendo cómo liberar la memoria que asigné para un sonido (archivo .wav) cuando, por ejemplo, quiero tocar música de introducción solo una vez.