2011-04-15 12 views
9

Frequenza dei fotogrammi: mi riferisco alla velocità con cui cambia la visualizzazione. Ad esempio, viene chiamato Ondraw() e la tela viene ridisegnata.Android: come trovare il frame rate di un dispositivo?

C'è una tariffa predefinita per tutti i dispositivi Android? Poiché questa velocità dipende dalla potenza di elaborazione del dispositivo, come scoprire la frequenza fotogrammi di un dispositivo, prima di iniziare a programmare per quel dispositivo mobile?

+0

stiamo parlando di una superficie GL, o in generale (come quando usi un'animazione)? Non esiste un framerate predefinito, posso dirlo in anticipo. – EboMike

+0

Solo per dire animazione 2D! utilizzo delle viste di superficie – m4n07

risposta

6

Questo può essere un follow-up a this question, in cui ho suggerito che avere un ciclo di ridisegno che ha continuato a disegnare più e più volte potrebbe essere un po 'eccessivo. Potrebbe esserci un api per scoprire le funzionalità del display dei dispositivi, ma se non ce ne sono a conoscenza. Quando scrivi la tua funzione loop/thread evento puoi controllare il framerate di quanto spesso chiami il tuo metodo 'draw'. In genere, penso che per la maggior parte degli scopi, sarebbe ok con una frequenza di aggiornamento di circa 30. Se stai scrivendo un gioco d'azione veloce, che richiede un'animazione rapida, allora potresti vuoi correre il più velocemente possibile, più fps, più fluido sarà.

Un tipico ciclo di eventi (funzione run filo) potrebbe essere simile a questo:

// define the target fps 
private static final int UPDATE_RATE = 30; // Frames per second (fps) 

public void run() { 
    while(running) { // volatile flag, set somewhere else to shutdown 
     long beginTimeMillis, timeTakenMillis, timeLeftMillis; 

     // get the time before updates/draw 
     beginTimeMillis = System.currentTimeMillis(); 

     // do the thread processing/draw 
     performUpdates(); // move things if required 
     draw();   // draw them on the screen 

     // get the time after processing and calculate the difference 
     timeTakenMillis = System.currentTimeMillis() - beginTimeMillis; 

     // check how long there is until we reach the desired refresh rate 
     timeLeftMillis = (1000L/UPDATE_RATE) - timeTakenMillis; 

     // set some kind of minimum to prevent spinning 
     if (timeLeftMillis < 5) { 
      timeLeftMillis = 5; // Set a minimum 
     } 

     // sleep until the end of the current frame  
     try { 
      TimeUnit.MILLISECONDS.sleep(timeLeftMillis); 
     } catch (InterruptedException ie) { 
     } 
    } 
} 
+0

Temo che non sia una buona idea per un motivo non ovvio: se il display del telefono viene aggiornato a una frequenza che non è un multiplo di 30 (ad esempio, 48, come Doogee X20L) , quindi l'animazione non sarà liscia. Questo perché ci saranno 48 frame visualizzati comunque, ma solo 30 diversi (forniti dal tuo codice), il che significa che alcuni di essi saranno visibili per 1/48 secondi, e alcuni per 2/48 secondi. Questo provoca un effetto nervoso che ti fa pensare "qui c'è qualcosa di sbagliato, ma non posso davvero spiegare". –

2

Non si può contare su una certa framerate. Android è un sistema operativo multitasking. Se ci sono alcuni thread in esecuzione in background che fanno un po 'di sollevamento, potresti non essere in grado di raggiungere il framerate che desideri. Anche se sei l'unico processo attivo, il framerate dipende dalla tua GPU e CPU e dall'orologio di ciascuno. Forse l'utente ha una ROM compromessa che modifica l'orologio in un valore personalizzato.

Alcuni telefoni potrebbero essere bloccati su un determinato framerate. HTC EVO è stato bloccato a 30 fps per un periodo di tempo più lungo, fino a quando non sono uscite le ROM personalizzate che hanno rimosso tale limite. I nuovi EVO ROM hanno rimosso anche questa limitazione.

Non so cosa si stia tentando di fare, ma la soluzione migliore è misurare il tempo dopo ogni fotogramma e utilizzare quel delta per le animazioni. Se stai cercando di visualizzare l'FPS, usa una media lisciata.

4

È possibile utilizzare lo strumento dumpsys fornito da Android. Per ottenere informazioni sul display del dispositivo eseguire il comando:

adb shell dumpsys display 

L'informazione che riguarda il prezzo del dispositivo è previsto in l'attributo "mPhys".

Troverete qualcosa di simile:

mPhys=PhysicalDisplayInfo{1080x1920, 60.000004 fps, densitiy 3.0, 
480.0x480.0 dpi, secure true} 

Il frame rate del dispositivo è nel secondo campo, nel mio caso è 60,000,004 mila fps

+0

Questa è la risposta corretta.L'FPS che ottieni qui è il massimo che sarai in grado di raggiungere su quel dispositivo, indipendentemente dal fatto che stai usando il disegno del software su una tela (con 'lockCanvas()') su un 'SurfaceView' (in loop) o rendering hardware OpenGL (in 'onDrawFrame()') su 'GLSurfaceView'. Penso che questo valore dovrebbe idealmente essere 60 (il suggerimento di Google è quello di mirare a quello in https://developer.android.com/training/testing/performance.html), ma potrebbe essere inferiore (ad esempio, è 47.24 su un marchio nuovo Doogee X20L). Non ho visto un telefono dove è più alto. È 60 su un Huawei P9 Lite o un Moto X. –

Problemi correlati