01 Managed Direct3D - Il Game Loop

In questo articolo parlo della struttura di base di una tipica applicazione Direct3D. La maggior parte di queste applicazioni infatti hanno del codice simile a quello riproposto in questo articolo.

Vediamolo da vicino: la maggior parte delle persone che vogliono imparare a usare il Direct3D lo fanno perchè vogliono scrivere un gioco. Così è tipico che la struttura di base di una applicazione di questo tipo si chiami "Game Loop". (Ho rubato il termine da un libro mediocre The Zen of Direct3D Game Programming.) Questa strutturazione è comune alla stragrande maggioranza delle applicazioni Direct3D compresi gli esempi che Microsoft fornisce al link : DirectX SDK . Il codice è simile al seguente:

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

Come puoi vedere chiaramente è differente da una applicazione WinForms "normale". Certamente sono rimasto incuriosito dalla presenza di un loop con "while" in un'applicazione grafica. Ero infatti abituato ad usare un Application.Run, che attende gli eventi del sistema provenienti dal mouse o la tastiera, trasferisce il controllo ad handlers configurati in precedenza, e poi esce quando ha eseguito le operazioni necessarie. Ma analiziamo il codice passo per passo.

using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D;

Queste righe sono facilmente chiare. Dovremmo usare cose incluse in questi namespace, quindi sarebbe stupido non includerli una volta per tutte. Nota che diamo per scontato l'aver installato le DirectX SDK, e abbiamo aggiunto come referenze al progetto sia Microsoft.DirectX.dll che Microsoft.DirectX.Direct3D.dll. (Per fare ciò, in Visual Studio, click destro su References and scegli Add Reference. Poi seleziona Microsoft.DirectX.dll e Microsoft.DirectX.Direct3D.dll utilizzando il tasto CTRL. Click OK.)

namespace Craig.Samples.Direct3D { public class Game : System.Windows.Forms.Form {

Il codice precedente è interessante , perchè dimostra che noi stiamo scrivendo una classe che deriva da quella System.Windows.Forms.Form, proprio come tutte le altre applicazioni WinForms che abbiamo scritto. Così tutto quello che sappiamo sulle Windows Forms potremo applicarle qui, dobbiamo solo imparare come applicarvi la teoria delle Direct3D.

static void Main() { Game app = new Game(); app.InitializeGraphics(); app.Show();

Qui è dove creiamo una nuova istanza del form che useremo (ricorda, il Main è statico, quindi non c'e' ancora nessa istanza), e poi richiamiamo InitializeGraphics, che è un metodo che noi andremo a scrivere del tutto. Lo vedremo in dettaglio in un articolo futuro. La chiamata a app.Show() rende semplicemente il form visibile.

while (app.Created) { app.Render(); Application.DoEvents(); }

Qui c'e' il succo della nostra applicazione, dove impiegheremo la maggior parte del tempo. Quello che andiamo a fare qui è controllare se il nostro forum è stato chiuso, e in caso negativo, richiamare il metodo Render. Render è il luogo dove tutto il magico mondo 3D prende forma, e ne parlerò in un prossimo articolo (resta in attesa!). La chiamata a Application.DoEvents è per rendere sicuro il servizio di eventuali processi sospesi di Windows - come ho detto, stiamo scrivendo una applicazione Windows Forms, e quindi non possiamo ignorare il sistema di messaggi del sistema operativo.

La ragione per cuio facciamo questo, invece che - dico - settare un timer e fare un rendering quando scade il tempo - è che probabilmente il nostro gioco vuole più CPU di quanta ne potrebbe avere. Così noi facciamo tutto il nostro lavoro di rendering in un semplice loop appunto invece che dire come al solito, "Oh, farò qualcosa quando un evento avverà", pur rimanendo la necessaria caratteristica di dover predisporre la macchina per processare messaggi di.

app.DisposeGraphics();

Quando necessario avremo l'esigenza di ripulire tutto, e per questo useremo un DisposeGraphics al momento che qualcuno chiuderà la nostra applicazione. E parleremo anche di questo più avanti.

Puoi compilare ed eseguire questo codice - andrà liscio come l'olio anche se non farà nulla. Naturalmente, visualizzerà un form bianco. Per fare qualcosa di più interessante, abbiamo bisogno di un DeviceDirect3D, di cui parleremo nel prossimo articolo.

See Also from the Tom Miller's Blog: http://blogs.msdn.com/tmiller/archive/2005/05/05/415008.aspx