Cuando se cambia el tamaño de un GLKView
, hay algunas operaciones detrás de escena que tienen lugar en los buffers y el contexto de ese GLKView
. Durante el tiempo que lleva realizar estas operaciones entre bastidores, el dibujo al GLKView
no produce resultados correctos.Cambio de tamaño de un GLKView
En mi caso, tengo una GLKView
que tiene setNeedsDisplay
permitido, por lo que cada vez que tengo que actualizar su contenido en la pantalla, acabo de llamar -setNeedsDisplay
en ese GLKView
. Estoy usando GLKView
para dibujar imágenes, así que si necesito dibujar una imagen con un tamaño diferente, también necesito cambiar el tamaño de GLKView
.
El problema: cuando cambio el tamaño de GLKView
y llamo al setNeedsDisplay
en esa vista, el resultado en la pantalla no es correcto. Esto se debe a que el GLKView
no finaliza las operaciones detrás de escena invocadas por el nuevo cambio de tamaño antes de intentar dibujar la nueva imagen.
Encontré una solución a esto llamando al: performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0
en lugar de solo setNeedsDisplay
en el GLKView
. Esto básicamente obliga al hilo principal a esperar a que se completen todas las operaciones OpenGL detrás de escena antes de llamar al setNeedsDisplay
. Aunque esto funciona bien, me pregunto si hay una mejor solución. Por ejemplo, ¿hay una llamada openGL para hacer que el hilo espere a que se completen todas las operaciones de OpenGL antes de continuar?
Podría abrazarte – dxb
¿Cómo lo reseteaste? ¿Recrearlo desde cero? ¿O hay un método específico para llamar? – flainez
En mi caso, después del cambio de tamaño configuré el objeto 'CIContext' de la siguiente manera:' ci_context = [CIContext contextWithEAGLContext: glkView.context] 'y luego llamo a' [glkView display] '. Tenga en cuenta que esto fue hace mucho tiempo y no seguí aprendiendo sobre esto, así que no asuma que es el enfoque correcto. – spybart