2011-01-30 16 views
5

Sto cercando un esempio di codice di esempio che mostra come ottenere 30 fotogrammi al secondo usando Android SurfaceView? Assumi che ogni fotogramma disegna un cerchio iniziando dalla posizione xey e ciascun fotogramma incrementa xey di uno.Come ottenere 30 fotogrammi al secondo con Android SurfaceView?

Domanda bonus: In alto sopra voglio sovrapporre un'altra vista per visualizzare il contenuto del testo in modo che qualsiasi grafica venga disegnata sia mostrata sotto questo contenuto di testo. Come questo può essere fatto?

risposta

3

Fai un filo che fa questo 30 volte al secondo:

  1. SurfaceHolder.lockCanvas di chiamata().
  2. Disegna nella tela (deve ridisegnare completamente tutti i pixel).
  3. Chiama SurfaceHolder.unlockCanvasAndPost().

In effetti, se il thread si limita a farlo senza tentare di mettere in pausa, verrà limitato al frame rate dello schermo.

È necessario assicurarsi che questo thread sia sincronizzato correttamente con la gestione della vista di superficie, ad esempio se la superficie sta cambiando o viene distrutta, il codice dovrebbe sincronizzarsi con il thread per assicurarsi che il thread si arresti mentre è in esecuzione questo succede.

Ovviamente ciò significa che si sta eseguendo il rendering del software nella tela. A seconda di ciò che si sta facendo, potrebbe andar bene creare un'animazione a 30 fps. In caso contrario, sarà necessario utilizzare GLSurfaceView. Potresti considerare di usarlo comunque, solo perché si prende cura della parte di threading per te.

+0

È davvero il modo migliore per farlo? – Derzu

6

Se si desidera un frame rate elevato, è necessario leggere lo GLSurfaceView. Sotto una normale vista di superficie sarai in balia dei calcoli del layout delle spese e del rendering CPU centric. Con GLSurfaceView è possibile scaricarlo nella GPU e avere un controllo rigoroso ed efficiente dei layout.

+0

GLSurfaceView accelera solo disegno (in quanto si utilizza OpenGL per disegnare ad esso). Non elimina i calcoli del layout ... infatti non dovrebbero mai esserci calcoli di layout durante il disegno, nemmeno il disegno della normale gerarchia delle viste. – hackbod

+1

"Non elimina i calcoli del layout" - ho detto che è stato? "non dovrebbero mai esserci calcoli di layout durante il disegno" - Non ho detto che neanche io? Tuttavia, parlare di ** frame rate ** di solito significa che qualcosa si sta muovendo/cambiando e che influenzerà i calcoli del layout. Se si utilizza un gestore di layout nativo, questo sarà costoso. –

+0

Se utilizzo GLSurfaceView in opposizione a SurfaceView, quanto questo avrebbe un impatto sull'utilizzo della batteria e quale effetto avrebbe sull'utilizzo della batteria se il dispositivo non ha GPU e la CPU sta facendo tutto il resto? Gli utenti finali non si preoccupano dei cicli CPU/GPU, ma si preoccupano della quantità di batteria scaricata dall'applicazione.Il mio obiettivo è trovare un approccio che non metta più di un carico ragionevole sulla batteria. – ace

2

Questo forse un thread vecchio, ma penso che questo possa aiutare gli altri. Ecco un bel tutorial che ho trovato su utilizzando SurfaceView: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

Ed ecco un bell'articolo su come implementare gioco-loop che può aiutare a limitare l'FPS a 30: http://www.koonsolo.com/news/dewitters-gameloop/

è possibile aggiungere testo direttamente sul tuo SurfaceView se ti piace, Ecco un esempio

public void onDraw(Canvas canvas) { 
    ... 
    // Add text 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setFakeBoldText(true);    // if you like bold 
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);    
} 
Problemi correlati