KINGx - Das inoffizielle PlayStation Forum & News Portal
[SOLVED] Tearing SDL - Druckversion

+- KINGx - Das inoffizielle PlayStation Forum & News Portal (http://www.kingx.de/forum)
+-- Forum:    PS Vita / PSP (/forumdisplay.php?fid=1)
+--- Forum: Homebrew (/forumdisplay.php?fid=8)
+---- Forum: Development (/forumdisplay.php?fid=34)
+---- Thema: [SOLVED] Tearing SDL (/showthread.php?tid=70681)


[SOLVED] Tearing SDL - Littlefighter19 - 14.12.2012 20:50

Hi, an alle Entwickler, die hier angemeldet sind.
Ich wollte mal ein wenig was mit SDL anfangen und aus diesem Grund hatte ich mal ein Tutorial für die PSP "geported". Mein Problem ist jetzt nur, das bewegte Objekt unterliegt grauenhaftem Tearing und ich habe keinen Plan wie ich das vermeiden soll (Ich hab bereits einen Frame Limiter, der die Frames auf eine beliebige FPS Anzahl beschränkt.)
Wüsste da vllt. jemand eine Lösung? (Ich verwende kein OpenGl, btw.)
Danke, schon mal im Vorraus.


RE: Tearing SDL - vista200 - 15.12.2012 09:43

Ich schätze mal, dass Du bei der Portierung

Code:
sceDisplayWaitVBlankScreen();


als letzte Methode in Deiner Render-Funktion oder Render-Loop vergessen hast. Diese Methode limitiert die FPS-Zahl auf 60 und zwingt das Programm erst dann zu zeichnen, wenn das Bild wieder am oberen Bildschirmrand aufgebaut wird.

Falls Du das schon gemacht hast, dann könnte etwas Quelltext hilfreich sein Wink


RE: Tearing SDL - Littlefighter19 - 15.12.2012 14:50

Danke für die Antwort.
Nein, ich habe diese Funktion noch nicht hinzugefügt. Ich schätze mal, du meintest die Funktion sceDisplayWaitVblank(); ?
EDIT: Ich hab die Funktion wie beschrieben hinzugefügt und jetzt befindet sich das Tearing permanent an der Hälfte vom Bild o.O Das heißt die OBERE Hälfte hinkt nach.... ich dachte der Bildaufbau erfolgt von oben nach unten? :/
EDIT2: Ich glaub ich darf den Source Code nicht erneut "veröffentlichen" weil:

Code:
/*This source code copyrighted by Lazy Foo' Productions (2004-2012)
and may not be redistributed without written permission.*/

EDIT3: Da ich nicht viel verändert habe, werde ich einfach den Link dazu posten ^^:
http://lazyfoo.net/SDL_tutorials/lesson20/index.php
EDIT4: Ich bin doch so bescheuert xD. Ich dachte ich hätte es vor dem Flippen des Bildschirms eingefügt. Nachdem ich es mir nochmal überprüft habe und mir aufgefallen ist, dass ich es vor dem Limitieren eingefügt habe, hat es funktioniert.
Vielen Dank!


RE: Tearing SDL - vista200 - 16.12.2012 00:16

Littlefighter19 :
EDIT4: Ich bin doch so bescheuert xD. Ich dachte ich hätte es vor dem Flippen des Bildschirms eingefügt. Nachdem ich es mir nochmal überprüft habe und mir aufgefallen ist, dass ich es vor dem Limitieren eingefügt habe, hat es funktioniert.
Vielen Dank!


Vor dem Limitieren? Oder vor dem Flippen?

Du musst die Framerate nicht mehr mit einer eigenen Funktion beschränken!
Das ist überflüssig, weil sceDisplayWaitVBlankStart() selbst die Framerate schon auf 60 FPS limitiert. Es kommt niemals mehr raus als 60.

sceDisplayWaitVBlank() wartet übrigens so lange, bis der Frame fertig gezeichnet wurde, sceDisplayWaitVBlankStart() eben so lange, bis der Framebuffer wieder bereit ist, einen neuen Frame zu zeichnen.
Das ist gut zu wissen, ich weiß zwar nicht, wofür, aber...
In meinen Projekten habe ich immer die Start-Variante verwendet. Du willst den Frame ja zeichnen, sobald es geht und nicht, wenn der letzte noch gerade so fertig gezeichnet wurde. Intern rattert die GPU nämlich noch ein bisschen weiter und setzt Pointer um etc...

Freut mich, wenn ich helfen konnte Smile

Viel Erfolg mit Deinen weiteren Projekten!


RE: Tearing SDL - Littlefighter19 - 16.12.2012 12:07

wurzelbums :
Vor dem Limitieren? Oder vor dem Flippen?


Vor dem Flippen hat es hingehört, ist ja logisch (Es wartet jetzt ja, bis der FB wieder bereit ist Wink und erst danach soll das Bild angezeigt werden), hatte es nur aus Versehen vor dem Limitieren nach dem Flippen aufgerufen.

wurzelbums :
Du musst die Framerate nicht mehr mit einer eigenen Funktion beschränken!
Das ist überflüssig, weil sceDisplayWaitVBlankStart() selbst die Framerate schon auf 60 FPS limitiert. Es kommt niemals mehr raus als 60.

Dann werd ich das mal per define raushauen (für die PSP), sollte die Binary wesentlich schlanker machen Big Grin.

wurzelbums :
sceDisplayWaitVBlank() wartet übrigens so lange, bis der Frame fertig gezeichnet wurde, sceDisplayWaitVBlankStart() eben so lange, bis der Framebuffer wieder bereit ist, einen neuen Frame zu zeichnen.
Das ist gut zu wissen, ich weiß zwar nicht, wofür, aber...
In meinen Projekten habe ich immer die Start-Variante verwendet. Du willst den Frame ja zeichnen, sobald es geht und nicht, wenn der letzte noch gerade so fertig gezeichnet wurde. Intern rattert die GPU nämlich noch ein bisschen weiter und setzt Pointer um etc...


wurzelbums :
Freut mich, wenn ich helfen konnte Smile

Viel Erfolg mit Deinen weiteren Projekten!

Vielen Dank nochmals Smile