VSync / real 30FPS auf Android

8

Ich arbeite an einem Spiel, das auf einigen Geräten nicht mit voller Geschwindigkeit ausgeführt werden kann. Auf Tegra2 liegt die Leistung mit vielen Optimierungen nahe 40 fps. Die Framerate ist stabil, aber die Animationen sind nicht flüssig genug, daher brauche ich einen vsync.
Mit 2.3 Android SDK können wir die EGL-Bibliothek nativ verwenden. Also versuche ich eglSwapInterval zu verwenden, aber kein Erfolg. In diesem GDC-Papier scheint Tegra2 dies zu können.

Ps: Thread.sleep (), um eine konstante FPS zu erzwingen, ist keine akzeptable Lösung

Ellis
quelle
Ich habe nichts für Android entwickelt, daher kann ich nicht sicher sagen, ob es möglich ist oder nicht, das Swap-Intervall zu beeinflussen, obwohl es zweifelhaft erscheint. Wenn das Stottern von Animationen auf einen großen Unterschied in den logischen Zeitschritten zurückzuführen ist, lohnt es sich vielleicht, einen durchschnittlichen Zeitschritt für eine Reihe von Frames zu berechnen. So verwenden Sie möglicherweise einen Zeitraum von 5-6 Frames. Es ist keine Antwort auf Ihre vsync-Frage, aber vielleicht hilft es Ihren Animationen, ohne einen festen Render-Zeitschritt einzuführen.
EnoughTea
1
Da Tegra2 ein sofortiger Renderer ist (keine Kachel), kann ich überprüfen, ob die Zeit vergangen ist, bevor eglSwapBuffer <1 / 60s ist. Wenn nicht, warte ich 1 ms länger als die 16 ms und mache den eglSwapBuffer. Das ist einfach schrecklich !!! Es ist sehr seltsam, dass sie bei Google IO 2011 über diese Funktion sprechen, wenn sie nicht implementiert ist.
Ellis

Antworten:

2

Gemäß diesem Thread in einigen OpenGL-Benchmarks ignorieren die Treiber der meisten Geräte das eglSwapInterval einfach, aber in tegra2 sollte vsync standardmäßig aktiviert sein (und eglSwapInterval kann verwendet werden, um es zu deaktivieren).

Vielleicht ist die vsync-Rate auf Ihrem Gerät so, dass Ihr Stottern dadurch entsteht, dass Sie manchmal schlagen, manchmal die Frame-Zeit verpassen? Haben Sie versucht, durch Deaktivieren von vsync die Situation tatsächlich zu verbessern?

Jari Komppa
quelle
Ich habe nicht versucht, vsync zu deaktivieren. Ich habe eglSwapInterval (..., 2) ohne Erfolg ausprobiert. Ich werde es so schnell wie möglich versuchen.
Ellis
Der Parameter swapinterval definiert die minimale Anzahl von Frames, die vergehen müssen. Es ist also möglich, dass Sie Stottern wie 2,2,3,2,2,3,2,2,2,3 sehen. Vorausgesetzt, das Ganze funktioniert. was nicht garantiert zu sein scheint =)
Jari Komppa
Hier ist ein weiteres kleines Nugget: "Das Intervall wird vor dem Speichern stillschweigend auf minimale und maximale implementierungsabhängige Werte begrenzt. Diese Werte werden durch die EGLConfig-Attribute EGL_MIN_SWAP_INTERVAL bzw. EGL_MAX_SWAP_INTERVAL definiert."
Jari Komppa
eglSwapInterval (, 2) ändert meine Framerate von 42 fps nicht und EGL_MIN_SWAP_INTERVAL ist 0 und MAX 10.
Ellis
Ich kann mir nur vorstellen, die Werte 0 bis 10 durchzugehen und zu prüfen, ob sich etwas ändert. Wenn dies nicht der Fall ist, ist die Funktion unterbrochen. (Oder gut, Werte 0,1,9 und 10)
Jari Komppa
0

Veröffentlichung eines Beispiels mit 30 FPS mithilfe der Choreographen-API. https://github.com/googlesamples/android-ndk/tree/master/choreographer-30fps Funktioniert das für Sie?

hak
quelle
1
Obwohl Ihr Link hilfreich sein könnte (ich habe ihn mir nicht angesehen), wird auf dieser Website bevorzugt, dass Links in der Antwort zusammengefasst werden, falls der Link stirbt, damit andere wissen, was sie davon erwarten können. Können Sie Ihrer Antwort einen hilfreichen Teil oder eine Beschreibung des Beispiels hinzufügen?
Jibb Smart
Und der Link ist tatsächlich tot :)
Karu