Essi suggest:Perché Apple suggerisce di inviare comandi OpenGL in una coda di background seriale quando questo porta inevitabilmente a crash?
Quando si utilizza GCD, utilizzare una coda seriale dedicata alla spedizione comandi per OpenGL ES; questo può essere usato per sostituire il modello mutex convenzionale.
Non capisco questa raccomandazione. C'è questo conflitto che non riesco a risolvere:
Quando l'applicazione delegato di un app riceve la chiamata -applicationWillResignActive
, si deve immediatamente smettere di chiamare qualsiasi funzione OpenGL.
Se l'app continua a chiamare una funzione OpenGL dopo il -applicationWillResignActive
restituito, l'app si bloccherà.
Se seguo la raccomandazione di Apple per richiamare le funzioni OpenGL in una coda di sfondo di serie, mi trovo di fronte a questo problema apparentemente irrisolvibile:
1) Dopo che ricevo -applicationWillResignActive
devo subito fermata chiamando eventuali ulteriori funzioni OpenGL.
2) Ma perché la coda di serie si trova nel bel mezzo di elaborazione di un blocco di codice in background, a volte il blocco di codice avrebbe finito esecuzione after
-applicationWillResignActive
ritorna, e l'applicazione si blocca.
Questa è un'illustrazione che mostra i "blocchi" concomitanti. Il thread principale riceve un messaggio completo e deve impedire ulteriori chiamate a OpenGL ES. Ma purtroppo questi accadere in una coda di fondo che non può essere fermato in volo di lavorare su un blocco:
|_____main thread: "STOP calling OpenGL ES!"_____|
_____|_____drawing queue: "Draw!"_____|_____drawing queue: "Draw!"_____|
Tecnicamente ho trovato alcun modo per fermare la coda di sfondo istantaneamente e evitare ulteriori chiamate a OpenGL nei precedenti. Un blocco di codice inviato una volta eseguito continua a essere in esecuzione.
L'unica soluzione che ho trovato era NON chiamare le funzioni OpenGL ES in background. Invece, chiamali sul thread principale per garantire che non verranno mai chiamati dopo che l'app ha perso l'accesso alla GPU.
Quindi se è bene chiamare le funzioni OpenGL ES in background, come si fa a garantire che non hanno mai vengono chiamati dopo l'applicazione è dimesso attiva?
Il gruppo di dispatch avrebbe causato l'attesa del thread principale fino al completamento del blocco di enqueued? Hai un link/esempio pratico su come è fatto? – openfrog