2012-05-16 16 views
10

Tengo un pequeño problema con mi aplicación iOS. Cuando estoy usando el simulador iOS 5.1 ipad/iphone la aplicación funciona, pero cuando uso un dispositivo iOS real (iPad y iPhone 5.1 también)Accidente de OpenGL ES en movimiento de fondo, iOS 5.1

la aplicación falla cuando se mueve en segundo plano después de hacer clic en el botón de inicio. .. con este error:

libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient: 
0x33240094: trap 
0x33240096: nop 

descubrí que se estaba OpenGL eS que todavía estaba calculando y haciendo que el bloqueo de la aplicación y encontré esta función: glfinish();

Pero eso aún no funciona aquí una muestra de mi código:

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [[CCDirector sharedDirector] resume]; 
} 

- (void)applicationWillResignActive:(UIApplication *)application { 
    glFinish(); 
    [[CCDirector sharedDirector] pause]; 
} 

creo que el problema es sólo que aquí ¿Hay alguien que tiene una idea de mi problema? Gracias

EDIT:

Problema resuelto con que:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
[[CCDirector sharedDirector] stopAnimation]; 
} 
- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
[[CCDirector sharedDirector] startAnimation]; 
} 

tal que puede ayudar a alguien x)

+0

Si no es necesario guardar los ajustes a la salida, este también funcionará: http://stackoverflow.com/questions/12878604/how-do-i-shut-down-opengl-tasks-in-applicationwillresignactive – Jeanne

Respuesta

12

En iOS 5.1 se hace cumplir que no se puede hacer una llamada a OpenGL después se le ha solicitado que renuncie a activo.

- (void)applicationWillResignActive:(UIApplication *)application 

es el lugar para parar todo, ya sea un CADisplayLink o una [[CCDirector sharedDirector] stopAnimation]

+0

sí, gracias, edité cuando descubrí que olvidé detener la animación x) –

+0

Los documentos a los que hace referencia @sup (http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ImplementingaMultitasking-awareOpenGLESApplication/ImplementingaMultitasking-awareOpenGLESApplication.html) dicen que OpenG L llamadas pueden (y en algunos casos deberían) hacerse desde applicationDidEnterBackground - que se ejecuta después de applicationWillResignActive. Por favor, enlace a documentos que no estén de acuerdo con los documentos de sup, de lo contrario, actualice. – janoside

+0

Tenga en cuenta que si llama OpenGL ES asyn desde el fondo, se bloqueará de vez en cuando debido a que el bloque continúa llamando a opengl incluso después de que le haya indicado al enlace de visualización o al temporizador que se detenga. http://stackoverflow.com/questions/19215554/how-to-stop-opengl-drawing-when-calling-opengl-from-background – openfrog

1

Técnicamente, el último método que se puede hacer OpenGL llamadas de es éste:

- (void)applicationDidEnterBackground:(UIApplication *)application 

Aunque a menudo es una buena idea suspender el dibujo después de la aplicaciónWillResignActive, esto es solo una recomendación y algunas aplicaciones tienen requisitos más allá de esto. Lo que en realidad es forzado es que no puede hacer ninguna llamada OpenGL una vez que su aplicación se mueve a un segundo plano.

Desde el docs:

Once your application exits its applicationDidEnterBackground: method, it must not make any new OpenGL ES calls. If your application makes an OpenGL ES call, it is terminated by iOS.

También, recuerde incluir glfinish() como su llamada GL final.

0

Compruebe si tiene el nodo de FPS en la pantalla, se podría prestando ..

* Editar - y comprobar para reproducción de audio