2010-10-19 16 views
7

Non sei ancora uno sviluppatore, solo cercando di scoprire se un app Android può fare quello che mi serve ..controllare la visualizzazione della frequenza di aggiornamento sul dispositivo Android

quello che mi serve:

semplice applicazione che visualizza un full frame di un singolo colore sullo schermo ad una certa intensità ad una frequenza fissa! Ne ho bisogno per uno scopo di sincronizzazione con una risoluzione il più alta possibile (ottenuta modificando un'intensità in uno schema noto con una frequenza fissa il più alta possibile).

Quali domande che ho:

  1. Ha una corsa dispositivo Android con una frequenza di visualizzazione fisso o c'è un modo per impostare una frequenza fissa di dire 60fps?

  2. Se la frequenza fissa può essere raggiunto, c'è un vsync interrupt o qualcosa di simile che mi permette di cambiare l'intensità sullo schermo al momento giusto.

  3. Se le due cose precedenti possono essere raggiunte, quale approccio ho bisogno di da prendere. Sto pensando ho bisogno di guardare a OpenGL ES e forse NDK .... Qualcuno potrebbe per favore mi punto nella giusta direzione ....

risposta

9

mi si aspetterebbe la frequenza di aggiornamento da fissare a livello di hardware o display driver. C'è an API for finding out what it is, ma dubito che sia possibile impostarlo.

Ho scritto un gioco che ha implementato un framerate fisso di 40 fps. La tecnica di base era di disegnare tutto su un buffer fuori campo ... qualcosa che accade automaticamente con GL ma che deve essere fatto a mano se si usa Canvas.

Quando il lavoro costoso e di lunghezza variabile di disegnare la scena fuori dallo schermo è completato, è possibile quindi bloccare il thread di rendering (o fare altro lavoro) fino al momento del rendering. In questo modo ogni frame verrà visualizzato a intervalli regolari. Questo ti dà un bel movimento fluido con il bonus che non stai bruciando la batteria tracciando troppo (molte applicazioni basate su GL fanno perché usano RENDERMODE_CONTINUOUSLY per nessuna buona ragione).

+0

Grazie mille Reuben! – Mathias

+0

Grazie mille per la tua risposta Reuben! È logico che il display sia eseguito a una frequenza fissa a livello hardware e che io usando getRefreshRate() possa ottenere la frequenza di aggiornamento dei display e usarlo nella mia sincronizzazione, quindi l'unica domanda che rimane è come faccio a sapere quando il display è stato reso. C'è un interrupt vsync o qualcosa di simile per me per controllare il mio contatore di fotogrammi che posso utilizzare nella mia generazione di intensità? – Mathias

+0

È bello incontrare un altro programmatore della vecchia scuola che ricorda chiaramente l'importanza di fare il più possibile nell'intervallo di blanking verticale ... :) –

0

Mathias,

Quindi, se si desidera sincronizzare con il display su Android, semplicemente lasciare Android vi dico quando la vista ha bisogno di essere disegnato - che è la cosa più semplice che si fa su Android. Otterrai una classe dalla classe View di Android fornita. Sovrascrivere il metodo View classes onDraw() che Android chiamerà ogni volta che la vista deve essere aggiornata.

Se si desidera assicurarsi che ciascun fotogramma visualizzato sia di un intervallo di tempo predeterminato, è probabile che si desideri impostare una nuova discussione. Nella nuova discussione entrerai in un ciclo temporale - inizia col catturare il System.nanoTime() (miliardesimo di una seconda risoluzione) in una variabile, quindi fai un ciclo fino a raggiungere la lunghezza desiderata del fotogramma, quindi aggiorna una variabile booleana statica globale. Questo booleano statico globale può essere controllato nel tuo metodo onDraw() per determinare quando è il momento di cambiare l'intensità.

Problemi correlati