2016-11-25 6 views
1

Ich habe mich nur gefragt, ob irgendjemand für mich etwas Licht darauf werfen könnte. Ich habe C# schon seit Jahren programmiert, aber im System.Drawing-Namespace außer der Bitmap-Klasse habe ich noch nie etwas angefasst und ich habe einige Tutorials verfolgt und etwas Code entwickelt, der funktioniert. Ich entwickle eine 2D Game Engine und der folgende Code ist für die Grafik-Engine, die GDI verwendet. Allerdings verstehe ich einfach nicht, wie dieser Code überhaupt funktioniert. Hier ist es:Wie funktioniert dieser Code? (GDI, C#)

Also, der Hauptteil, der für mich verwirrend ist, ist dies;

Wie wird die Back-Bitmap aktualisiert? und warum wird der Back-Buffer gelöscht und nicht der Front-Buffer?

Außerdem wird die initialize-Methode einmal aufgerufen und die update-Methode wird einmal pro Frame in einer while-Schleife aufgerufen.

+1

Nur für den Rekord: Ich habe einige Zweifel über den Code, den Sie gefunden oder geschrieben als 'game.Form.CreateGraphics();' ist in der Regel eine schlechte Idee, wie das Grafikobjekt puffern. – TaW

+0

Aber warum? Alles, was ich gerade mache, verweist auf das Formulargrafikobjekt? –

+0

Es gibt keine solche Sache. Sie sind (sic!), Einen zu schaffen. Aber du solltest nicht. Es ist das "Paint" -Event, um das zu tun! (Es sei denn, du benötigst eine woanders, weil du Dinge messen möchtest oder __nicht persistente__ Grafik wie eine Gummibandlinie zeichnen willst.) - Außerdem: Der Frontbuffer wird implizit gelöscht, da er nichts enthält, wenn du seine Bitmap erstellst. – TaW

Antwort

1

Nachdem Sie initialisieren die backBuffer Grafikobjekte aus der Bitmap, jedes Mal, wenn Sie sagen, zum Beispiel backBuffer.DrawLine(...) GDI + wird die Pixel Manipulationen direkt auf dieser Bitmap tun. Sie sind in gewisser Weise miteinander verbunden. Denken Sie an backBufferBitmap als die Leinwand und an backBuffer als die Bürste.

Die frontBuffer wird stattdessen aus dem Formular initialisiert. So ist das Formular seine Leinwand und was auch immer Sie mit frontBuffer machen, wird zum Formular gezogen - in diesem Fall zeichnet es hier die backBufferBitmap.

Es ist im Grunde ein Doppel-Puffer-Schema, das viele Vorteile gegenüber dem direkten Zeichnen Ihrer Linien und Kreise in das Formular hat, z. weniger Flackern. Immer wenn Sie etwas in ein Formular zeichnen, denken Sie daran, dass es sehr oft entfernt wird (z. B. wenn Sie das Formular außerhalb des Bildschirmbereichs verschieben). Sie müssten es mit dem Ereignis Paint des Formulars aktualisieren.

Nach Update() genannt wird, müssten Sie Ihre Szene backBuffer neu zu zeichnen, bevor Sie Update erneut aufrufen, da die Bitmap von Ihrem Clear() geschwärzt wird, nachdem es auf dem Bildschirm gezogen wird.

+0

Vielen Dank! Das war sehr informativ. Ich habe erkannt, dass der Hauptgrund, warum ich verwirrt war, darin lag, dass ich nicht wusste, dass ich, nachdem ich den Backbuffer initialisiert hatte, nicht wusste, dass er speziell auf die Bitmap zeichnen würde. Danke für das Aufräumen. Ich hatte das Gefühl, dass das passierte, aber ich war mir nicht sicher. Nur damit Sie wissen, ich verwende nicht das Paint-Ereignis und ich verwende stattdessen meine eigenen Methoden, indem ich Application.DoEvents für jeden Frame aufruft. Vielen Dank! –

+0

Es scheint, als ob Sie mit dieser Antwort glücklich sind @ MathewO'Dwyer? Wenn dies der Fall ist, markieren Sie es als akzeptiert, damit andere schnell die richtige Antwort finden können, wenn sie im selben Bereich nach Hilfe suchen und Jens ebenfalls Anerkennung zollen. – MrApnea

+0

@FSDaniel Okay, tut es das erste Mal leid :). –

0

frontBuffer wird immer aktualisiert, weil jedes Mal, wenn Sie frontBuffer.DrawImageUnscaled(backBufferBitmap,0,0); in update()

backBuffer rufen gelöscht gettting weil Sie backBuffer.Clear(Color.Black);

auch anrufen, wird initialize() soll nur einmal aufgerufen werden. Zum Zeitpunkt der Objekterstellung. Und ich glaube, dass es Teil eines größeren Programms ist, wo Eltern update() des Kindes anrufen.

+0

Sind Sie sicher, dass das Ihre Zweifel waren? – Prajwal

+0

hey, danke für deine Antwort. Initialisieren und Aktualisieren sind jedoch meine eigenen Methoden, die ich erstellt habe. Was ich nicht verstehe ist, wie das Bitmap aktualisiert wird? –

+0

Auch was ich meinte war, warum ich backBuffer.clear anstelle von frontBuffer.clear anrufe? Warum muss ich das tun? –