PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VSync in Windows


aths
2003-01-26, 11:57:11
Ich berechne in Delphi ein TBitmap vor und kopiere es anschließend in ein Image. Das ganze zeigt VSync-Artefakte (manchmal scheint der Hintergrund hervor.)

Gibt es eine Möglichkeit, vor jedem Kopieren zu warten, bis der Kathodenstrahl rechts unten angekommen ist?

Demirug
2003-01-26, 12:21:10
Denn V-Sync kannst du nicht abwarten.

Den Effekt den du allerdings hast ist nicht direkt ein V-Sync Effekt sonder entsteht aufgrund der Tatsache das Windows ja bekanntermassen immer in den Frontbuffer schreibt und normalerweise vor dem Zeichnen den Hintergrund des Fensters mit einem Brush löscht.

Um diesen Effekt zu beseitigen muss man dieses Löschen unterbinden und alles in ein Bitmapzeichen und als letztes dieses Bitmap auf einen Schlag auf den Bildschirm kopieren. Dadurch läst sich dieser Effekt (bis auf ein mögchliches Tearing) beseitigen.

Jetzt frag mich aber bitte nicht wie man das Delphi macht. Mit C++ habe ich das schon öfter gemacht.

aths
2003-01-26, 14:30:23
Originally posted by Demirug
Um diesen Effekt zu beseitigen muss man dieses Löschen unterbinden und alles in ein Bitmapzeichen und als letztes dieses Bitmap auf einen Schlag auf den Bildschirm kopieren. Dadurch läst sich dieser Effekt (bis auf ein mögchliches Tearing) beseitigen.

Jetzt frag mich aber bitte nicht wie man das Delphi macht. Mit C++ habe ich das schon öfter gemacht. Ich schreibe:MainForm.Image1.Picture.Graphic:=Bitmap;Das BitMap wird vorher zeilenweise beschrieben (mit Bitmap.Scanline)

Ich müsste eine Möglichkeit haben, das Neuzeichnen eines Elements bzw. des gesamten Fensters für einige Zeit schlichtweg verbieten zu können.

janjan
2003-01-30, 14:55:40
probiers mal mit BitBlt():

http://www.delphipraxis.net/viewtopic.php?t=1978&highlight=bitblt

http://www.delphipraxis.net/viewtopic.php?t=1951&highlight=bitblt

http://www.delphipraxis.net/viewtopic.php?t=715&highlight=bitblt

Nasenbaer
2003-02-02, 15:25:06
Die Formen in Delphi haben die Option DoubleBuffered.

Frag mal die Hilfe wo du die Option genau findest.

EDIT: Form1.DoubleBuffered := True;

Es sollte dann funzen.

Mfg Nasenbaer