Pregunta

En mi solicitud, necesito usar un montón de MP3 diferentes diferentes (aproximadamente 500 artículos uno por uno)

Entonces uso Skaction PlaySoundFilename

Después de ~ 200 sonidos, se bloqueó con 'Error al cargar el recurso: el recurso S234.MP3 no se puede cargar'.La memoria se eleva a 70 MB.

¿Cómo evitar esto?

lo que intenté:

  1. recrear sonido en cada iteración

    SKAction *mySound=[SKAction playSoundFileNamed:aa waitForCompletion:YES];
    
  2. Crear la variable en el principio de .m

    SKAction *mySound;
    
  3. y reutilizarlo en iteraciones

        mySound=[SKAction playSoundFileNamed:aa waitForCompletion:YES];
    

    2. Cargue todos los sonidos a la matriz una vez al inicio

    for (int j=0;j<500;j++){
            NSString *aa=[NSString stringWithFormat:@"s%d.mp3", j];
            [item.sounds addObject:[SKAction playSoundFileNamed:aa waitForCompletion:YES]];
        }
    

    ... pero nunca cambió, se estrella y no puede cargar mp3.

    ¿Cómo limpiar esta memoria fugas?

    editado También intenté apagar el arco y traducirlo manualmente cada vez.Nada cambiado.

¿Fue útil?

Solución

Este pequeño ditty aquí le permitirá usar una tabla antigua regular, pero personalizar la reproducción en el código.

https://github.com/pepelkod/ios-examples/tree/Master / PlaySoundwithVolume

+(SKAction*)playSoundFileNamed:(NSString*)fileName atVolume:(CGFloat)volume waitForCompletion:(BOOL)wait{
// setup audio
NSString*   nameOnly = [fileName stringByDeletingPathExtension];
NSString*   extension = [fileName pathExtension];
NSURL *soundPath = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:nameOnly ofType:extension]];
AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:soundPath error:NULL];
[player setVolume:volume];
[player prepareToPlay];

SKAction*   playAction = [SKAction runBlock:^{
    [player play];
}];
if(wait == YES){
    SKAction*   waitAction = [SKAction waitForDuration:player.duration];
    SKAction* groupActions = [SKAction group:@[playAction, waitAction]];
    return groupActions;
}
return playAction;

}

Otros consejos

Puede estar mejor con un motor de sonido "adecuado". Usted podría usar Avaudioplayer o incluso mejor , Objectal (ya incluido en KOBOLD KIT ). De esa manera, tiene más control sobre la precarga y el almacenamiento en caché de los archivos de sonido, y el tratamiento de audio de transmisión (MP3) de manera diferente a partir de efectos de sonido de corta duración (generalmente CAF o WAV).

Para archivos de sonido muy cortos, digamos más de 5 segundos, MP3 no es ideal. Debes probar CAF / WAV en su lugar.

y considere cuánto usan sus archivos de sonido en la memoria. Diga que cada archivo MP3 se almacena en un búfer de 250 kb, Times 500, luego que usa más de 120 MB de memoria. No observe el tamaño del archivo MP3 porque es un formato comprimido, y es probable que se incompare en búfer.

Creo que te estás quedando sin descriptores de archivos. Lo que he encontrado es que cada vez que se ha abierto el nombre de PlaySoundFilename, se abre el archivo de sonido y nunca se cerró ... por lo que el descriptor de archivo no se libera.

Mis pruebas en los instrumentos me llevan a creer que hay alrededor de 250 descriptores de archivos disponibles. Y mi investigación me dice que no solo el acceso de archivos los usa sino también otras cosas. Así que creo que sus ~ 200 archivos de sonido suenan casi el derecho a bloquearse. Cada vez que un archivo de sonido es el siguiente archivo que Xcode está intentando acceder, no obtengo nada del depurador, pero cuando el siguiente archivo es un PNG (tengo mucho arte, entonces sonidos) da,

Error= 24 (demasiados archivos abiertos)

Encontré el error mientras se reproduce la prueba y cambiando a mi escena del menú desde la escena del juego, cada vez que perdí. Así que normalmente, no importaba, sino que ejecutaba el método de inicio para la escena del juego, la escena y más se acumulaba estos archivos de sonido abiertos.

He buscado y buscado por una forma de cerrar estos archivos, pero no ha logrado nada. Estoy pensando en implementar un Singleton para ejecutar mi sonido y mover todas las llamadas de PlaySoundFilenamed, para que solo se llamen una vez. Creo que este es un error de Apple. Estos archivos deben cerrarse con el arco. ¿Alguien ha encontrado algo similar?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top