VSync / real 30FPS su Android


8

Sto lavorando a un gioco che non può funzionare alla massima velocità su alcuni dispositivi. Su Tegra2, con molte ottimizzazioni, le prestazioni sono vicine a 40 fps. Il framerate è stabile ma le animazioni non sono abbastanza fluide, quindi ho bisogno di un vsync.
Con 2.3 Android SDK, possiamo usare la libreria EGL in modo nativo. Quindi provo ad usare eglSwapInterval ma senza successo. In questo documento GDC , sembra che Tegra2 possa farlo.

Ps: Thread.sleep () per forzare un FPS costante non è una soluzione accettabile


Non ho sviluppato nulla per Android, quindi non posso dire con certezza se è possibile o meno influenzare il suo intervallo di scambio, anche se sembra dubbio. Quindi, se la balbuzie dell'animazione deriva da una grande differenza nei suoi timestep logici, forse vale la pena provare a calcolare un timestep medio per un batch di frame? In questo modo , forse usando un periodo di 5-6 fotogrammi. Non è una risposta alla tua domanda vsync, ma forse aiuterà le tue animazioni senza introdurre un timestep di rendering fisso.
Basta il

1
Poiché Tegra2 è un renderer immediato (non un riquadro), posso verificare se il tempo trascorso prima che eglSwapBuffer sia <1 / 60s. In caso contrario, aspetto 1ms in più rispetto ai 16ms e eseguo eglSwapBuffer. È semplicemente orribile !!! È molto strano che parlino di questa funzione al Google IO 2011 se non è stata implementata.
Ellis,

Risposte:


2

Secondo questa discussione su alcuni benchmark di opzioni, la maggior parte dei driver dei dispositivi semplicemente ignora eglSwapInterval, ma tegra2 dovrebbe avere vsync abilitato di default (e eglSwapInterval può essere usato per disabilitarlo).

Forse la frequenza vsync sul tuo dispositivo è tale che la tua balbuzie viene a volte colpendo, a volte perdendo il tempo di frame? Hai provato se la disabilitazione di vsync migliorerà effettivamente le cose?


Non ho provato a disabilitare vsync. Ho provato eglSwapInterval (..., 2) senza successo. Ci proverò al più presto.
Ellis,

Il parametro swapinterval definisce la quantità minima di frame che devono passare, quindi è possibile che tu stia vedendo balbuzie come 2,2,3,2,2,3,2,2,2,3 .. supponendo che tutto funzioni, che non sembra essere garantito =)
Jari Komppa il

Ecco un altro piccolo nugget: "l'intervallo viene bloccato automaticamente ai valori minimi e massimi dipendenti dall'implementazione prima di essere memorizzati; questi valori sono definiti rispettivamente dagli attributi EGLConfig EGL_MIN_SWAP_INTERVAL e EGL_MAX_SWAP_INTERVAL".
Jari Komppa,

eglSwapInterval (, 2) non cambia il mio framerate di 42fps e EGL_MIN_SWAP_INTERVAL è 0 e MAX 10.
Ellis

L'unica altra cosa che mi viene in mente di provare è passare attraverso i valori da 0 a 10 e vedere se c'è qualche cambiamento. Se non c'è, beh, la funzione è rotta. (O bene, valori 0,1,9 e 10)
Jari Komppa,

0

Ha pubblicato un campione facendo 30FPS usando l'API di coreografo. https://github.com/googlesamples/android-ndk/tree/master/choreographer-30fps Funziona per te?


1
Anche se il tuo link potrebbe essere utile (non l'ho mai visto), su questo sito è preferibile che i link siano riepilogati nella risposta nel caso in cui il link si interrompa e che altri sappiano cosa aspettarsi da esso. Sei in grado di includere una porzione utile o una descrizione del campione nella tua risposta?
Jibb Smart

E il link è in realtà morto :)
Karu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.