2012-05-16 13 views
10

Ho un piccolo problema sulla mia applicazione iOS. Quando utilizzo il simulatore iOS 5.1 ipad/iphone l'applicazione funziona, ma quando utilizzo un dispositivo iOS reale (anche iPad e iPhone 5.1)OpenGL ES arresto anomalo su spostamento sfondo, iOS 5.1

l'applicazione si arresta in modo anomalo quando si passa allo sfondo dopo aver fatto clic sul pulsante Home. .. con questo errore:

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

ho scoperto che è stato OpenGL ES che è stato ancora calcolando e rendendo il crash dell'applicazione ed ho trovato questa funzione: glFinish();

ma che ancora non lavorare qui un esempio del mio codice:

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

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

penso che il problema è proprio qui C'è qualcuno che ha un'idea del mio problema? Grazie

EDIT:

Problema risolto con quello:

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

forse che possono aiutare qualcuno x)

+0

Se non è necessario per salvare le impostazioni in uscita, questo funzionerà anche: http://stackoverflow.com/questions/12878604/how-do-i-shut-down-opengl-tasks-in-applicationwillresignactive – Jeanne

risposta

12

In iOS 5.1 è fatta rispettare che non è possibile effettuare una chiamata a OpenGL dopo ti è stato chiesto di dimettermi attivo.

- (void)applicationWillResignActive:(UIApplication *)application 

è il posto giusto per fermare tutto, sia che si tratti di un CADisplayLink o un [[CCDirector sharedDirector] stopAnimation]

+0

sì grazie, ho modificato quando ho trovato che ho dimenticato di fermare l'animazione x) –

+0

I documenti a cui fa riferimento @sup (http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ImplementingaMultitasking-awareOpenGLESApplication/ImplementingaMultitasking-awareOpenGLESApplication.html) dicono che OpenG Le chiamate L possono (e in alcuni casi devono) essere eseguite da applicationDidEnterBackground - che viene eseguito dopo applicationWillResignActive. Si prega di collegare ai documenti che non sono d'accordo con i documenti di sup, altrimenti si prega di aggiornare. – janoside

+0

Nota che se chiami OpenGL ES asyn dallo sfondo, si bloccherà di tanto in tanto perché il blocco continua a chiamare opengl anche dopo che hai detto al link di visualizzazione o al timer di fermarsi. http://stackoverflow.com/questions/19215554/how-to-stop-opengl-drawing-when-calling-opengl-from-background – openfrog

1

Tecnicamente, l'ultimo metodo è possibile effettuare chiamate OpenGL da è questo:

- (void)applicationDidEnterBackground:(UIApplication *)application 

Sebbene sia spesso una buona idea sospendere il disegno dopo applicationWillResignActive, questa è solo una raccomandazione e alcune app hanno requisiti oltre questo. Quello che in realtà è applicato è che non è possibile effettuare chiamate OpenGL una volta che l'app si sposta sullo sfondo.

Dal 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.

Inoltre, ricordarsi di includere glFinish() come la chiamata GL finale.

0

Verificare se si ha il nodo FPS sullo schermo, potrebbe essere il rendering ..

* Modifica - e controllare l'audio giocare

Problemi correlati