Quando uno GLKView
viene ridimensionato, ci sono alcune operazioni dietro le quinte che si svolgono sui buffer e il contesto di quello GLKView
. Durante il tempo necessario per eseguire queste operazioni dietro le quinte, il disegno su GLKView
non produce risultati corretti.Ridimensionamento di un GLKView
Nel mio scenario, ho un GLKView
che ha setNeedsDisplay
attivato, in modo che ogni volta che ho bisogno di aggiornare il suo contenuto sullo schermo, mi basta chiamare -setNeedsDisplay
su quel GLKView
. Sto usando GLKView
per disegnare immagini, quindi se ho bisogno di disegnare un'immagine con una dimensione diversa, ho bisogno anche di cambiare la dimensione del GLKView
.
Il problema: quando si modifica la dimensione di GLKView
e si chiama setNeedsDisplay
su quella vista, il risultato sullo schermo non è corretto. Questo perché lo GLKView
non ha terminato le operazioni dietro le quinte invocate dalla nuova modifica della dimensione prima che provi a disegnare la nuova immagine.
Ho trovato un modo per ovviare a questo chiamando: performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0
anziché setNeedsDisplay
su GLKView
. Questo in pratica costringe il thread principale ad attendere che tutte le operazioni openGL dietro le quinte siano completate prima di chiamare setNeedsDisplay
. Anche se questo funziona bene, mi chiedo se c'è una soluzione migliore. Ad esempio, c'è una chiamata openGL per fare in modo che il thread attenda che tutte le operazioni openGL siano completate prima di continuare?
Potrei abbracciarti – dxb
Come lo hai resettato? Ricreando da zero? O c'è un metodo specifico per chiamare. – flainez
Nel mio caso, dopo il ridimensionamento stavo impostando il mio oggetto 'CIContext' in questo modo:' ci_context = [CIContext contextWithEAGLContext: glkView.context] 'e quindi chiamando' [glkView display] '. Si noti che questo è stato molto tempo fa e non ho continuato a imparare a riguardo, quindi non dare per scontato che sia l'approccio giusto. – spybart