www.jammni.de

Logo - Kleiner Drache

Logo - Drache2.2. Das Direct3D-Device

Home >> Tutorials >> DirectX 9−Tutorial
 

InitializeGraphics

In diesem Teil des Tutorials geht es um den ganzen Initialisierungscode der vorgenommen werden muss um ein Direct3D-Programm zum Laufen zu bringen und dann später etwas auf dem Bildschirm anzuzeigen.
Doch zunächst gibt's wieder einen kleinen Codeausschnitt. Am Ende des Listings gibt es den bis hierher entwickelten Quellcode samt ausführbarer Datei wieder zum Download.
 
 
Listing 3 - InitializeGraphics.cs:
1:    private Device device;
2:   
3:    protected bool InitializeGraphics()
4:    {
5:      try
6:      {
7:        PresentParameters presParams = new PresentParameters();
8:        presParams.Windowed = true;
9:        presParams.SwapEffect = SwapEffect.Discard;
10:        device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presParams);
11:       return true;
12:     }
13:     catch
14:     {
15:       return false;
16:     }
17:   }

  Als alles erstes wird ein Objekt deklariert - das Device-Objekt. Das ist das wichtigste Objekt für Direct3D überhaupt. Es representiert die Grafikhardware im System und ist somit für alles zuständig, was mit Zeichnen etc. zu tun.
Um nun eine Instanz zu erstellen wird der new-Operator benutzt. In Zeile 10 ist der entsprechende Aufruf zu sehen. Dort fällt natürlich auf, dass der Konstruktor gleich noch ein paar Parameter erwartet. Es gibt zwar noch eine einfachere Version, aber um das Einstellen einiger Parameter kommt man einfach nicht herum.

Der erste Parameter gibt die Nummer des verwendeten Grafikadapters an. In der Regel ist es die 0 für die erste Grafikkarte im System. Das ist also nur wichtig, wenn wirklick mal mehrere Grafikkarten im System vorhanden sind.
Der nächste Parameter gibt an, ob die Direct3D-Aufrufe von der Grafik-Hardware (sofern möglich) oder über die CPU ausgeführt werden sollen.
Als nächstes folgt die Angabe des Fensterhandles, in dem die DirectX-Oberfläche anzeigt wird. In unserem Fall also this für das Fenster der Anwendung.
Danach folgen noch einige Angaben für die Erstellung des Graphicdevice. Hier wird meist nur angegeben, dass die Vertices nur per Software verarbeitet werden. Hier gibts noch einige weitere Optionen die oder-verknüpft werden können. In der Online-Hilfe zum SDK sind die weiteren Einstellungen noch nachzulesen. Für den weiteren Verlauf des Tutorials sind diese aber uninteressant.

Die PresentParameters-Klasse

Der letzte Parameter ist wieder etwas komplexer. Dazu wird in Zeile 7 ein Objekt vom Typ PresentParameters erstellt. Es verwaltet nocheinmal einige weitere Einstellungen die die Erstellung des Device-Objektes beeinflussen. In Zeile 8 sagen wir dem Objekt, dass Direct3D innerhalb eines Fensters benutzt wird. Hier gäbe es zusätzlich die Option die Anwendung als Vollbild-Anwendung auszuführen. Der Vollbild-Modus hat einen entscheidenen Vorteil: fast alle Grafikoperationen werden schneller ausgeführt als im Fenstermodus. Doch momentan werden wir den Volbildmodus noch nicht benutzen. Unsere Anwendung werden auch noch nicht so intensiv Gebrauch von der Grafikkarte machen, dass wir das letzte bisschen Perfomance herauskitzeln müssen.
Die zweite von uns vorgenommene Einstellung betrifft das Handling des Backbuffers. Doch dazu jetzt erstmal ein kleiner Exkurs in Back- und Frontbuffer.

Exkurs: Back- und Frontbuffer

Der Backbuffer ist ein Speicherbereich - gewöhnlich innerhalb der Grafikkarte - auf dem alle Zeichenoperationen ausgeführt werden und der erst anschließend auf dem Monitor zur Anzeige gebracht wird. Der Frontbuffer ist das Gegenstück dazu - er beschreibt also die Anzeige, die momentan auf dem Monitor zu sehen ist. Der Vorteil des Backbuffers ist seine Geschwindigkeit. Die Operationen, die auf dem Backbuffer ausgeführt werden, gehen etwas schneller als beim Frontbuffer. Außerdem sind die Zeichenoperationen auch nicht einzeln auf dem Monitor nachzuverfolgen.

Die Option Discard sagt eigentlich nichts weiter aus, als dass die Grafikkarte selbst entscheiden kann, wie sie den Backbuffer zur Anzeige auf den Monitor bringt. Zusätzlich kann sie danach mit dem Backbuffer machen, was sie will. Es ist also nicht ratsam, nach einem Render-Vorgang den Backbuffer ohne vorheriges Löschen zu benutzen bzw. davon auszugehen, dass er sich in einem bestimmten Zustand befindet. Weiterhin kann auch die Option Flip gewählt werden, die den Backbuffer mit dem Frontbuffer austauscht und die Option Copy die den Backbuffer einfach über den Frontbuffer kopiert.

Außerdem findet sich in der Initialize-Methode noch ein try-catch-Block. Dieser dient dazu eventuelle Fehler bei der Initialisierung des Direct3D-Devices abzufangen und das Programm in einen definierten Zustand zu versetzen. Treten keine Fehler auf, wird true zurückgegeben, ansonsten false.

Das war's jetzt eigentlich schon zur Initialisierung. Hört sich vielleicht alles ziemlich schwierig an - aber letztlich nichts, was man nicht nach einer Woche schon aus dem Kopf kann.
Im nächsten Unterkapitel geht es ganz allgemein ums Rendern - leider immernoch nichts zum Anzeigen auf dem Bildschirm, aber dafür gibt es ja noch Kapitel 3.