[Wiz] Tearing mit SDL in den Griff bekommen


simonsunnyboy

Member
Joined
Mar 30, 2009
Messages
133
Age
44
Location
Friedrichshafen
Website
final-memory.org
WEBSITE
http://final-memory.org/
LOCATION
Friedrichshafen
Hallo zusammen,

ich hörte, man kann über eine Softwareroutine das Tearing beim Wiz in den Griff bekommen. Irgendwie muss der Screen gedreht werden, wenn ich richtig gelesen habe.

Ich vermute, ich brauche dann einen zusätzlichen SDL_Surface, auf den zuerst gezeichnet wird und der dann irgendwie gedreht werden muss, bevor er auf den Screen Surface geblittet wird.

Gibt es irgendwo funktionierenden Beispielcode oder andere simple Workarounds?

Grüße,
ssb
 
Genau richtig.
Wenn Du einen Screen mit 240x320 öffnest, dann gibts kein Tearing.

Ich bin selber kein Coder, kann aber ein wenig dazu sagen.

Es gibt prinzipiell zwei Möglichkeiten, Tearing zu umgehen. Bei beiden muss logischerweise der Schirm mit 240x320 geöffnet werden.

Die eine wäre, dass Du ganz normal programmierst, eine Routine einbaust, die den Framebuffer dann um 90 Grad dreht (was über OpenGL am besten geht, ansonsten frissts doch ein paar Ressourcen).
Bei Emulatoren MUSS man das so machen, da die Spiele ja alle so aufbauen.

Schreibst Du ein eigenes Spiel, kannst Du es auch noch anders machen:
Du programmierst das Spiel komplett hochkant (drehst also alle Grafiken, programmierst auch hochkant, etc.)
Wenn Du es am PC testest, musst Du da natürlich wieder eine Dreh-Routine einbauen (oder hast eben ein um 90 Grad gedrehtes Spiel).

Am WIZ läufts dann aber richtig und ohne Tearing :)
 
simonsunnyboy said:
Mir würde eine entsprechende Drehroutine langen, die ich optional für den Wiz einblenden kann. Ich würde den Code zunächst 1:1 auf dem PC schreiben und erst am Ende die Wizfeatures optional einbauen.

benutzt du den Touschscreen?
 
Mit den Timings kann man das Tearing ein wenig verringern, aber beseitigen geht nur mit 240x320 Screens.
 
Ich hoffe mal, du benutzt den Touchscreen, also die Maus nicht..

Dann würde ich es so machen:

du nennst deine Variable um, die den Screen erstellt, z.b.

von
Code:
screen = SDL_SetVideoMode( 320, 240, 32 , SDL_SWSURFACE );

in
Code:
screen2 = SDL_SetVideoMode( 240 320, 32 , SDL_SWSURFACE );

dann müssen alle SDL_Flip auch screen2 refreshen und nicht screen.

vor JEDEM SDL_Flip fügst du nun diesen Code hinzu (musst SDL_Surface *temp_surface noch definieren):
Code:
<i>
</i>SDL_Rect r;
r.x=0;
r.y=0;
temp_surface = rotozoomSurface(screen, 90, 1, SMOOTHING_ON); //SMOOTHING_ON bin ich mir gerade nicht sicher, ist vermutlich ein Makro. 
                       //Stattdessen kannst es ja mal mit 0 oder 1 verscuhen, falls das nicht geht
SDL_BlitSurface(temp_screen, NULL, screen2, &r);
SDL_Flip(screen2);

so ung. müsste es gehen, wenn ED recht behält...
 
Den Touchscreen wollte ich ab und an schon benutzen...gerade mein erstes Projekt ist ein einfaches Puzzlespiel zum Klicken, aber da sind FPS und Tearing noch nicht so das Problem.

Für das andere werde ich den Rotozoomer mal verwenden. Danke für das kurze aber prägnante Beispiel!

Muss man da ne spezielle Lib dazulinken?
 
simonsunnyboy said:
Den Touchscreen wollte ich ab und an schon benutzen...gerade mein erstes Projekt ist ein einfaches Puzzlespiel zum Klicken, aber da sind FPS und Tearing noch nicht so das Problem.

Naja, wenn du den Touchscreen verwendest, musst du x und y vertauschen.
Muss man da ne spezielle Lib dazulinken?

Für das rotieren musst du SDL_gfx einbinden.
 
Back
Top