VSync / real 30FPS sur Android

8

Je travaille sur un jeu qui ne peut pas fonctionner à pleine vitesse sur certains appareils. Sur Tegra2, avec de nombreuses optimisations, les performances sont proches de 40 ips. Le framerate est stable mais les animations ne sont pas assez fluides, j'ai donc besoin d'un vsync.
Avec 2.3 SDK Android, nous pouvons utiliser la bibliothèque EGL en mode natif. J'essaie donc d'utiliser eglSwapInterval mais sans succès. Dans ce GDC Paper , il semble que Tegra2 puisse le faire.

Ps: Thread.sleep () pour forcer un FPS constant n'est pas une solution acceptable

Ellis
la source
Je n'ai rien développé pour Android, donc je ne peux pas dire avec certitude s'il est possible ou non d'affecter son intervalle de swap, même si cela semble douteux. Donc, si le bégaiement d'animation provient d'une grande différence dans ses pas de temps logiques, cela vaut peut-être la peine d'essayer de calculer un pas de temps moyen pour un lot d'images? Comme ça , en utilisant peut-être une période de 5-6 images. Ce n'est pas une réponse à votre question vsync, mais peut-être que cela aidera vos animations sans introduire un pas de temps de rendu fixe.
EnoughTea
1
Comme Tegra2 est un moteur de rendu immédiat (pas une tuile), je peux vérifier si le temps écoulé avant que eglSwapBuffer ne soit <1 / 60s. Sinon, j'attends 1 ms de plus que les 16 ms et fais l'eglSwapBuffer. C'est tout simplement horrible !!! Il est très étrange qu'ils parlent de cette fonction lors du Google IO 2011 si elle n'est pas implémentée.
Ellis

Réponses:

2

Selon ce fil sur certains benchmark opengl es, la plupart des pilotes de périphériques ignorent simplement l'eglSwapInterval, mais tegra2 devrait avoir vsync activé par défaut (et eglSwapInterval peut être utilisé pour le désactiver).

Peut-être que le taux de synchronisation sur votre appareil est tel que votre bégaiement vient parfois de la frappe, parfois du manque de temps de trame? Avez-vous essayé si la désactivation de vsync améliorera réellement les choses?

Jari Komppa
la source
Je n'ai pas essayé de désactiver vsync. J'ai essayé eglSwapInterval (..., 2) sans succès. J'essaierai dès que possible.
Ellis
Le paramètre swapinterval définit la quantité minimale d'images qui doit passer, il est donc possible que vous voyiez un bégaiement comme 2,2,3,2,2,3,2,2,2,3 .. en supposant que tout fonctionne, qui ne semble pas être garanti =)
Jari Komppa
Voici un autre petit nugget: "l'intervalle est limité silencieusement aux valeurs dépendant de l'implémentation minimum et maximum avant d'être stocké; ces valeurs sont définies par les attributs EGLConfig EGL_MIN_SWAP_INTERVAL et EGL_MAX_SWAP_INTERVAL respectivement."
Jari Komppa
eglSwapInterval (, 2) ne change pas mon framerate de 42fps et EGL_MIN_SWAP_INTERVAL est 0 et MAX 10.
Ellis
La seule autre chose à laquelle je peux penser est de parcourir les valeurs de 0 à 10 et de voir s'il y a un changement. S'il n'y en a pas, eh bien, la fonction est rompue. (Ou bien, valeurs 0,1,9 et 10)
Jari Komppa
0

Publié un exemple faisant 30FPS en utilisant l'API chorégraphe. https://github.com/googlesamples/android-ndk/tree/master/choreographer-30fps Est-ce que cela fonctionne pour vous?

hak
la source
1
Bien que votre lien puisse être utile (je ne l'ai pas examiné), il est préférable sur ce site que les liens soient résumés dans la réponse au cas où le lien mourrait, et que les autres sachent à quoi s'attendre. Pouvez-vous inclure une partie utile ou une description de l'échantillon dans votre réponse?
Jibb Smart
Et le lien est en fait mort :)
Karu