In hierdie artikel verduidelik ek die basiese hoë-vlak struktuur van a tipiese Direct3D program. Die meeste Direct3D applikasies sal die volgende kode bevat.
Kom ons wees eerlik: die meeste mense wat Direct3D gebruik, doen dit waarskynlik om ‘n game te skryf. Dit maak dus sin dat die tipiese hoë-vlak struktuur van ‘n Managed Direct3D applikasie die "Game Loop" genoem word. (Ek het dié term vanaf die boek The Zen of Direct3D Game Programming gesteel.) Hierdie kode, of ‘n variasie daarvan, sal in baie Managed Direct3D applikasies voorkom, insluitende die “sample code” wat Microsoft met die DirectX SDK verskeep. Die kode lyk iets soos:
using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Craig.Samples.Direct3D { public class Game : System.Windows.Forms.Form { static void Main () { Game app = new Game(); app.InitializeGraphics(); app.Show(); while (app.Created) { app.Render(); Application.DoEvents(); } app.DisposeGraphics(); } } }
U zal dadelijk zien dat dit totaal verschillend is met een normale WinForms applicatie. Ik was donders dronken toen ik hiermee begon, het maakte namelijk gebruik van een een of andere while loop ofzo dik brak zal bill gates wel in elkaar gehacked hebben. In ‘n grafiese applikasie te sien. Ek is meer gewoond om ‘n roep na Application.Run te sien, en dan te wag vir events soos ‘n muis-klik of ‘n sleutelbord-aksie, hulle event-handlers te roep, en dan te exit as my program weggaan. Kom ons beskou die kode van naderby.
using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D;
Hierdie gedeelte behoort redelik duidelik te wees. Ons gaan klasse in hierdie namespaces gebruik, en ons wil onsself die moeite spaar om hul volle name herhaaldelik in te tik. Neem kennis dat ons ook die DirectX SDK ge-installeer moet hê, asook verwysings (references) na Microsoft.DirectX.dll en Microsoft.DirectX.Direct3D.dll .
namespace Craig.Samples.Direct3D { public class Game : System.Windows.Forms.Form {
Hierdie kode is eintlik heel interessant, omdat dit wys dat ons ‘n klas skryf wat vanaf System.Windows.Forms.Form derive, net soos al die ander WinForms apps wat jy al geskryf het. Dit wil sê alles wat jy weet van Windows Forms is nog steeds van toepassing, en ons moet nou net leer hoe om dieDirect3D dele te integreer.
static void Main () { Game app = new Game(); app.InitializeGraphics(); app.Show();
Dis hier wat ons a nuwe instansie van die vorm maak (onthou, Main is staties, so daar is nog nie ‘n instansie nie), en dan InitializeGraphics roep, wat ‘n metode is wat ons self skryf. Ons sal nie hierdie metode in ‘n volgende artikel kyk. Die roep na app.Show() maak net die vorm sigbaar.
while (app.Created) { app.Render(); Application.DoEvents(); }
Hierdie is die vleis van die applikasie, waar dit meeste van sy tyd sal spandeer. Wat ons hier doen, is om te kyk of die vorm toegemaak is, en indien nie, roep ons die Render metode. Render is waar al die cool 3D tekeninge plaasvind, en ek sal in meer detail daaroor in ‘n later artikel gesels (stay tuned!). Die roep na Application.DoEvents is om seker te maak dat enige Windows events geprosseseer word – soos ek genome het, ons skryf ‘n Windows Forms applikasie, so ons moet nog steeds die “message pump” bedien.
Die rede hoekom ons dit op hierdie manier doen, eerder as om – sê – ‘n Timer te stel en dan te render as dit afgaan – is dat ons game waarskynlik soveel moontlik CPU as moontlik wil hê. So ons doen al ons tekeninge na die skerm (rendering) in ‘n tight loop eerder as die normale "O, ek sal slegs iets doen as ‘n windows event plaasvind" benadering. Maar natuurlik sal ons nog steeds boodskappe van Windows moet hanteer.
app.DisposeGraphics();
Ons moet natuurlik skoonmaak wanneer ons klaar is, so ons verskaf ‘n DisposeGraphics metode wat geroep moet word sodra iemand ons applikasie beëindig.Ons sal later ook meer hieroor praat.
Jy voortgaan en hierdie kode kompileer – dit behoort te hardloop solank jy leë InitializeGraphics, Render, en DisposeGraphics metodes verskaf. Dit sal natuurlik net ‘n skoon vorm wees. Om enigiets interessant te doen, het ons ‘n Direct3D Device nodig, waaroor ons volgende keer sal gesels.