HARALD MELCHER

Flattiverse - Raumschiffe Programmieren in C#

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);