SDL_BlitSurface
-
Hi,
ich versuche mich gerade an SDL und bin dabei auf folgendes Flacker-Problem gestoßen.
Ich habe ein Hintergrundbild und darüber bewege ich ein Sprite.
In der Initialisierung mache ich u.a. folgendes:SDL_BlitSurface(back, NULL , screen, NULL); SDL_BlitSurface(image, NULL, screen, &dst); SDL_Flip(screen);
"screen" habe ich mir per SDL_SetVideoMode geholt. "back" ist das Hintergrundbild und "image" der/die/das Sprite. "dst" beschreibt die Position des Sprites.
In der Mainloop mache ich nun folgendes:
SDL_BlitSurface(back, &old_pos , screen, &old_pos); SDL_BlitSurface(image, 0, screen, &dst); SDL_Flip(screen);
old_pos speichert hier die alte Position des Sprites.
Jetzt habe ich aber das Problem, dass der Bildschirm extrem flackert.
Das Flackern kann ich nun wahlweise unterdrücken, indem ich den Fullscreen deaktiviere oder immer das gesamte Hintergrundbild auf den Screen blitte.
Aus Performancegründen wäre es aber ja ganz nett, nur den nötigen Teil zu blitten.
Vielleicht kann mir jemand helfen und sagen was ich da übersehe.dank und gruß dirk
-
Ich hab zwar noch nie was mit SDL gemacht, aber normalerweise (zumindestens in OpenGL und DirectX) zeichnet man soviel ich weiß schon immer den kompletten Bildschirm neu!
-
Original erstellt von flenders:
Ich hab zwar noch nie was mit SDL gemacht, aber normalerweise (zumindestens in OpenGL und DirectX) zeichnet man soviel ich weiß schon immer den kompletten Bildschirm neu!bist du verrückt. das würde doch flackern wie sau
-
wieso, man verwendet ja double- oder tripllebuffering
da flackert nichts!
-
ja ach so, sollte ich vielleicht noch sagen: Doublebuffering nutze ich natürlich. SDL zeichnet dann automatisch erstmal auf den Backbuffer und tauscht erst bei Aufruf von
SDL_Flip(screen);
Front und Back.
-
SDL_DisplayFormat für die zu blittenden Surfaces aufgerufen? Sollte man tun.. Wobei's eigentlich auch nicht flackert wenn man's lässt. Wird nur saulahm ohne.
Nur SDL_Flip() alleine tuts auch nicht. Bei SDL_SetVideoMode muss man auch die entsprechenden Parameter SDL_HWSURFACE|SDL_DOUBLEBUF angeben.
/* edit */
Original erstellt von -Dirk-:
**...oder immer das gesamte Hintergrundbild auf den Screen blitte.
Aus Performancegründen wäre es aber ja ganz nett, nur den nötigen Teil zu blitten.
**Ja, mach das so. Immer alles komplett neu blitten. Wenn du SDL_DisplayFormat auf deine Bilder anwendest reicht die Performance dann auch.
[ Dieser Beitrag wurde am 06.01.2003 um 22:53 Uhr von DrGreenthumb editiert. ]
-
Also SDL_DisplayFormat hatte ich benutzt. Die Flags SDL_HWSURFACE|SDL_DOUBLEBUF waren auch gesetzt. Wenn der Performanceunterschied nicht so groß ist, werde ich wohl erstmal immer den ganzen Schirm neu blitten.
gruß dirk