2010-10-19 20 views
7

Todavía no ha sido un desarrollador, tratando de averiguar si una aplicación para Android puede hacer lo que necesito ..Display Control de Frecuencia de actualización en el dispositivo Android

lo que necesito:

aplicación sencilla que muestra una fotograma completo de un solo color en pantalla a una cierta intensidad a una frecuencia fija! Lo necesito para un propósito de sincronización con una resolución lo más alta posible (lograda al cambiar una intensidad en un patrón conocido con la frecuencia fija más alta posible).

¿Qué preguntas que tengo:

  1. ¿Tiene una carrera dispositivo Android con una frecuencia de visualización fijo o hay alguna manera de se establece en un frecuencia fija de, digamos, 60 fps?

  2. Si la frecuencia fija puede ser alcanzado , ¿hay una interrupción VSYNC o algo similar que me permite cambiar la intensidad en la pantalla en el momento adecuado.

  3. Si las dos cosas anteriores pueden ser logrado, qué enfoque necesito para tomar. Estoy pensando que necesito mirar en OpenGL ES y tal vez NDK .... Podría alguien por favor me punto en la dirección correcta ....

Respuesta

9

Yo esperaría que la frecuencia de actualización que se fijará en hardware o en el nivel del controlador de pantalla. Hay an API for finding out what it is, pero dudo si puede configurarlo.

Escribí un juego que implementó una velocidad de fotogramas fija de 40 fps. La técnica básica era dibujar todo en un búfer fuera de la pantalla ... algo que sucede automáticamente con GL, pero que tiene que hacerse a mano si se usa Canvas.

Cuando finaliza el trabajo costoso y de longitud variable de dibujar su escena fuera de la pantalla, puede bloquear el hilo de representación (o hacer otro trabajo) hasta que sea el momento de procesar. Hacer esto asegurará que cada cuadro se muestre a intervalos regulares. Esto te da un buen movimiento suave con la ventaja de que no estás quemando la batería dibujando demasiado (algo que muchas aplicaciones basadas en GL hacen porque usan RENDERMODE_CONTINUAMENTE sin ninguna buena razón).

+0

Muchas gracias Reuben! – Mathias

+0

Muchas gracias por su respuesta Reuben! Tiene sentido que la pantalla se ejecute a una frecuencia fija en un nivel de hardware y que al usar getRefreshRate() pueda obtener la frecuencia de actualización de las pantallas y usar eso en mi sincronización, por lo que la única pregunta que queda es ¿cómo sé cuándo? la pantalla ha sido renderizada. ¿Hay una interrupción vsync o algo similar para mí para controlar mi contador de cuadros que puedo usar en mi generación de intensidad? – Mathias

+0

Es agradable conocer a un compañero programador de la vieja escuela que recuerda claramente la importancia de hacer tanto como sea posible en el intervalo de borrado vertical ... :) –

0

Mathias,

lo tanto, si desea sincronizar con la pantalla en Android, simplemente dejará decir androide cuando la vista tiene que ser dibujado - que es lo más básico que uno hace en android. Obtendrás una clase de la clase View proporcionada por Android. Anulará el método View classes onDraw() que android llamará cada vez que la vista necesite actualizarse.

Si desea asegurarse de que cada fotograma que visualiza tiene un período de tiempo predeterminado, es probable que desee configurar un nuevo Tema. En el nuevo subproceso, ingresará un ciclo de temporización: comience capturando System.nanoTime() (milmillonésima de una segunda resolución) en una variable, luego buclee hasta alcanzar la longitud de trama deseada y luego actualice una variable booleana estática global. Este booleano estático global se puede verificar en su método onDraw() para determinar cuándo es el momento de cambiar la intensidad.

Cuestiones relacionadas