VSync / 30FPS real en Android

8

Estoy trabajando en un juego que no puede ejecutarse a toda velocidad en algunos dispositivos. En Tegra2, con muchas optimizaciones, el rendimiento es cercano a 40 fps. La velocidad de fotogramas es estable, pero las animaciones no son lo suficientemente suaves, por lo que necesito una sincronización virtual.
Con 2.3 Android SDK, podemos usar la biblioteca EGL de forma nativa. Así que trato de usar eglSwapInterval pero no tengo éxito. En este documento de GDC , parece que Tegra2 puede hacerlo.

Ps: Thread.sleep () para forzar un FPS constante no es una solución aceptable

Ellis
fuente
No he desarrollado nada para Android, por lo que no puedo decir con certeza si es posible o no afectar su intervalo de intercambio, aunque parece dudoso. Entonces, si la tartamudez de la animación proviene de una gran diferencia en sus pasos de tiempo lógicos, ¿tal vez valga la pena intentar calcular un paso de tiempo promedio para un lote de cuadros? De esta manera , tal vez usando un período de 5-6 cuadros. No es una respuesta a su pregunta vsync, pero tal vez ayudará a sus animaciones sin introducir un paso de tiempo de renderizado fijo.
EnoughTea
1
Como Tegra2 es un procesador inmediato (no un mosaico), puedo verificar si el tiempo transcurrido antes de que eglSwapBuffer sea <1 / 60s. Si no, espero 1 ms más que los 16 ms y hago el eglSwapBuffer. Eso es simplemente horrible! Es muy extraño que hablen sobre esta función en Google IO 2011 si no se implementa.
Ellis

Respuestas:

2

De acuerdo con este hilo en algunos puntos de referencia de opengl es, la mayoría de los controladores de dispositivos simplemente ignoran eglSwapInterval, pero tegra2 debería tener vsync habilitado por defecto (y eglSwapInterval puede usarse para deshabilitarlo).

¿Quizás la tasa de sincronización en su dispositivo es tal que su tartamudez proviene de golpear a veces, a veces perder el tiempo de cuadro? ¿Has probado si deshabilitar vsync realmente mejorará las cosas?

Jari Komppa
fuente
No he intentado deshabilitar vsync. Intenté eglSwapInterval (..., 2) sin éxito. Lo intentaré lo antes posible.
Ellis
El parámetro swapinterval define la cantidad mínima de fotogramas que deben pasar, por lo que es posible que vea un tartamudeo como 2,2,3,2,2,3,2,2,2,3 ... suponiendo que todo funcione, lo que no parece estar garantizado =)
Jari Komppa
Aquí hay otra pequeña pepita: "el intervalo se fija silenciosamente a los valores dependientes de implementación mínimos y máximos antes de almacenarse; estos valores están definidos por los atributos EGLConfig EGL_MIN_SWAP_INTERVAL y EGL_MAX_SWAP_INTERVAL respectivamente".
Jari Komppa
eglSwapInterval (, 2) no cambia mi framerate de 42 fps y EGL_MIN_SWAP_INTERVAL es 0 y MAX 10.
Ellis
Solo otra cosa que se me ocurre intentar es revisar los valores del 0 al 10 y ver si hay algún cambio. Si no hay, bueno, la función está rota. (O bueno, valores 0,1,9 y 10)
Jari Komppa
0

Publicó una muestra haciendo 30FPS usando la API de coreógrafo. https://github.com/googlesamples/android-ndk/tree/master/choreographer-30fps ¿ Eso funciona para usted?

hak
fuente
1
Si bien su enlace puede ser útil (no lo he visto), se prefiere en este sitio que los enlaces se resumen en la respuesta en caso de que el enlace muera, y para que otros sepan qué esperar de él. ¿Puede incluir una porción útil o una descripción de la muestra en su respuesta?
Jibb Smart
Y el enlace de hecho está muerto :)
Karu