OpenGL: el marco salta parcialmente hacia adelante y hacia atrás [cerrado]

8

Estoy trabajando en un proyecto con SDL y OpenGL. El juego funciona muy bien en Windows, Linux, OS X e iOS. Sin embargo, la versión de Android muestra un problema en mi teléfono en particular. He probado otro dispositivo y allí funciona muy bien también.

El problema que estoy enfrentando es una falla visual. Sucede en ráfagas: por ejemplo: 90 cuadros están bien y luego 40 cuadros el fallo. La falla en sí es un poco difícil de describir, pero lo intentaré. La pantalla se actualiza parcialmente correcta (desde la parte superior de mi teléfono hasta aproximadamente la mitad) y parpadea parcialmente. El efecto de parpadeo es una especie de salto de ida y vuelta. Estoy pensando que está relacionado con el doble buffer. Creo que porque lo que veo en la pantalla es saltar de un lado a otro de cada fotograma. Es como si la mitad de la pantalla tuviera un cuadro en el tiempo y el siguiente cuadro 2 cuadros tarde. Más o menos como una procesión de Echternach, supongo que se podría decir. Si lo trazo en un gráfico en el que pasa el tiempo al bajar el gráfico, creo que '

          left half | right half  (phone is in landscape)
         ------------------------
time  1 |      1           1
time  2 |      2           2
time  3 |      3           1
time  4 |      4           4
time  5 |      5           3
time  6 |      6           6
time  7 |      7           5
time  8 |      8           8
time  9 |      9           7

Entonces, la mitad derecha es un cuadro en el tiempo, y el siguiente cuadro, muestra el cuadro anterior. Esto es compatible con mi teoría de que hay un problema con el doble búfer. Parece que de alguna manera no puede actualizar por completo el backbuffer antes de que aparezca en la pantalla, o algo así.

Además, la división entre bueno y falla en la pantalla es diferente de un cuadro a otro, lo que creo que prueba que es un problema de sincronización y depende en gran medida del tiempo de lo que está sucediendo. Agregar glFinish();antes de la SDL_GL_SwapWindow();llamada no ayuda.

Información de la versión: SDL informa que vsync se activará. Sin embargo, creo que esto no es desgarrador. Mi teléfono es un Samsung Galaxy S3 mini y ejecuta Android 5.1.1 (CM12) y la GPU (Mali-400) es compatible con OpenGL ES 2.0. Otros juegos funcionan bien en mi teléfono.

Martijn Courteaux
fuente
¿Cuál es el modelo de teléfono?
concept3d
Samsung Galaxy s3 Mini. Ejecutando CyanogenMod 12.
Martijn Courteaux
Descubrí que está en todas partes en mi teléfono, pero más sutil. Incluso en la interfaz de usuario del sistema que se desplaza por los menús.
Martijn Courteaux
2
Esto suena más como un error en su teléfono. Supongo que una actualización de firmware es la forma más probable de resolverlo.
rolobo
@rolobo: Sí, de hecho. Sin embargo, estoy muy contento con todo lo demás y mi teléfono es solo un dispositivo de prueba para este proyecto y no forma parte de mi proceso de desarrollo principal.
Martijn Courteaux

Respuestas:

0

Una sección del archivo Léame habla de ello:

Una nota sobre el uso de la técnica de representación de "rectángulos sucios"

[...] donde solo actualiza una parte de la pantalla en cada cuadro, puede notar una variedad de fallas visuales en Android, que no están presentes en otras plataformas. Esto es causado por el uso de SDL de EGL como el sistema de soporte para manejar contextos OpenGL ES / ES2, en particular el uso de la función eglSwapBuffers. Como se indica en la documentación de la función "El contenido de los buffers auxiliares siempre está indefinido después de llamar a eglSwapBuffers".

Establecer el atributo EGL_SWAP_BEHAVIOR de la superficie en EGL_BUFFER_PRESERVED no es posible para SDL ya que requiere EGL 1.4, disponible solo en el nivel API, por lo que la única solución disponible en esta plataforma es volver a dibujar la pantalla completa en cada fotograma.

Ibrahim CS
fuente
Incluya un resumen de la información relevante de ese enlace y una explicación de cómo la información responde a la pregunta.
tyjkenn
... la pregunta original no decía nada sobre la representación de "rectángulos sucios"?
Trevor Powell