Flimmerfrei anzeigen
Wenn das Gui Sonnen und andere Körper zeichnet, löscht es zuerst den Schirm und zeichnet dann alle Körper neu. Das flimmert, weil sich das Bild immer von leer zu gefüllt neu aufbaut.
Eine Abhilfe ist das Doppel-Puffern: Man zeichnet in einen Buffer im Hintergrund, der nicht angezeigt wird. Wenn das Bild im Hintergrund fertig ist, kopiert man es mit einer einzigen Operation auf den Vordergrund und ersetzt so das bisherige Bild. Da sich die meisten Körper nicht bewegt haben, flimmern sie dadurch nicht. Körper, die sich bewegt haben, erscheinen an der neuen Position.
Gui.cs
Der Konstruktor von Gui
erstellt eine Bitmap bitmap
in der benötigten Größe (Width
und Height
) und fügt folgenden Handler an das Load
-Event und an das Resize
-Event von Gui an:
private void Gui_Load(object sender, EventArgs e) {
bitmap?.Dispose();
bitmap = new Bitmap(Width, Height);
}
Dann setzt er im Konstruktor folgende Parameter:
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
Die OnPaint-Methode verwendet dann statt des Graphics-Kontextex aus e.Graphics
den Graphics-Kontext der Bitmap mittels
Graphics g = Graphics.FromImage(bitmap)
Alle anderen Zeichenbefehle bleiben gleich.
Nach dem letzten Zeichenbefehl erfolgt noch das “Blitten”, dh. Kopieren der Bitmap auf den eigentlichen Schirm, dessen Graphics-Kontext noch in e
liegt:
e.Graphics.DrawImage(bitmap, 0, 0);