OpenGL: Frame springt teilweise hin und her [geschlossen]

8

Ich arbeite an einem Projekt mit SDL und OpenGL. Das Spiel funktioniert hervorragend unter Windows, Linux, OS X und iOS. Die Android-Version zeigt jedoch insbesondere auf meinem Telefon ein Problem. Ich habe ein anderes Gerät getestet und dort funktioniert es auch super.

Das Problem, mit dem ich konfrontiert bin, ist ein visueller Fehler. Es passiert in Bursts: zum Beispiel: 90 Frames in Ordnung und dann 40 Frames die Panne. Die Panne selbst ist schwer zu beschreiben, aber ich werde es versuchen. Der Bildschirm wird teilweise korrekt aktualisiert (von der Oberseite meines Telefons bis ungefähr zur Hälfte) und teilweise flackert. Der Flackereffekt ist eine Art Hin- und Herspringen. Ich denke, dass es mit doppelter Pufferung zusammenhängt. Ich denke das, weil das, was ich auf dem Bildschirm sehe, in jedem Bild hin und her springt. Es ist, als ob die Hälfte des Bildschirms ein Bild in der Zeit und das nächste Bild 2 Bilder zu spät ist. Ziemlich wie eine Prozession von Echternach, könnte man sagen. Wenn ich es in einem Diagramm zeichne, in dem die Zeit vergeht, wenn ich mich im Diagramm nach unten bewege, denke ich, dass ich '

          left half | right half  (phone is in landscape)
         ------------------------
time  1 |      1           1
time  2 |      2           2
time  3 |      3           1
time  4 |      4           4
time  5 |      5           3
time  6 |      6           6
time  7 |      7           5
time  8 |      8           8
time  9 |      9           7

Die rechte Hälfte ist also ein Bild in der Zeit und das nächste Bild zeigt das vorherige Bild. Dies unterstützt meine Theorie, dass es ein Problem mit der doppelten Pufferung gibt. Es sieht so aus, als könnte der Backbuffer nicht vollständig aktualisiert werden, bevor er auf den Bildschirm gebracht wird, oder so.

Außerdem ist die Aufteilung zwischen gut und fehlerhaft auf dem Bildschirm von Bild zu Bild unterschiedlich. Diese Punkte beweisen meines Erachtens, dass es sich um ein Synchronisationsproblem handelt, und hängen stark vom Zeitpunkt des Geschehens ab. Hinzufügen glFinish();vor dem SDL_GL_SwapWindow();Anruf hilft nicht.

Versionsinfo: SDL meldet, dass vsync aktiviert werden soll. Ich glaube jedoch, dass dies nicht reißt. Mein Handy ist ein Samsung Galaxy S3 mini und läuft mit Android 5.1.1 (CM12) und die GPU (Mali-400) unterstützt OpenGL ES 2.0. Andere Spiele laufen auf meinem Handy in Ordnung.

Martijn Courteaux
quelle
Was ist das Telefonmodell?
Konzept3d
Samsung Galaxy s3 Mini. Laufen CyanogenMod 12.
Martijn Courteaux
Ich entdeckte, dass es überall in meinem Telefon ist, aber subtiler. Auch in der System-Benutzeroberfläche durch Menüs scrollen.
Martijn Courteaux
2
Das klingt eher nach einem Fehler in Ihrem Telefon. Ich vermute, ein Firmware-Update ist der wahrscheinlichste Weg, um es zu lösen.
Rolobo
@rolobo: Ja, in der Tat. Ich bin jedoch mit allem anderen sehr zufrieden und mein Telefon ist nur ein Testgerät für dieses Projekt und nicht Teil meines Hauptentwicklungsprozesses.
Martijn Courteaux

Antworten:

0

Ein Abschnitt der Readme-Datei spricht darüber:

Ein Hinweis zur Verwendung der Rendering-Technik "Schmutzige Rechtecke"

[...] Wenn Sie nur einen Teil des Bildschirms in jedem Frame aktualisieren, stellen Sie unter Android möglicherweise eine Reihe von visuellen Störungen fest, die auf anderen Plattformen nicht vorhanden sind. Dies wird durch die Verwendung von EGL durch SDL als Unterstützungssystem für die Verarbeitung von OpenGL ES / ES2-Kontexten verursacht, insbesondere durch die Verwendung der Funktion eglSwapBuffers. Wie in der Dokumentation zur Funktion "Der Inhalt von Zusatzpuffern ist nach dem Aufruf von eglSwapBuffers immer undefiniert" angegeben.

Das Festlegen des EGL_SWAP_BEHAVIOR-Attributs der Oberfläche auf EGL_BUFFER_PRESERVED ist für SDL nicht möglich, da EGL 1.4 erforderlich ist, das nur auf API-Ebene verfügbar ist. Die einzige auf dieser Plattform verfügbare Problemumgehung besteht darin, den gesamten Bildschirm jedes Frames neu zu zeichnen.

Ibrahim CS
quelle
Bitte fügen Sie eine Zusammenfassung der über diesen Link relevanten Informationen und eine Erläuterung zur Beantwortung der Frage durch die Informationen bei.
Tyjkenn
... die ursprüngliche Frage nichts über das Rendern von "schmutzigen Rechtecken" aussagte?
Trevor Powell