\\ Home : Articoli : Stampa
Prima di cominciare DirectX11
Di robydx (del 09/01/2010 @ 14:25:24, in Direct3D11, linkato 2398 volte)

In questo primo articolo spiegherò alcune informazioni base prima di iniziare a programmare.

Per programmare in C++ le Direct3D è necessario installare le ultime SDK che comprendono le librerie .lib e gli header da includere nel progetto. Le librerie vengono fornite in versione 32 e 64bit. Aggiungete da Visual Studio (o da qualsiasi editor utilizziate) il link alle cartelle Include e Lib/X86 o lib/X64 presenti nella cartella dell’SDK. Indicate infine tramite editor quali libreria volete linkare nel progetto o tramite le macro, ad esempio

#pragma comment (lib,"dxgi.lib")

include la libreria dxgi.lib

DirectX è basato sul modello COM. Il modello COM prevede che per ogni classe sia fornita un’interfaccia non direttamente istanziabile che deriva dall’interfaccia base IUnknown. Non è possibile istanziare direttamente la classe ma è necessario utilizzare metodi forniti da funzioni statiche o altre classi. L’interfaccia IUnknown contiene al suo interno un contatore che memorizza il numero di puntatori che puntano all’interfaccia. I 3 metodi base di IUnknown prevede 3 metodi: AddRef, Release e QueryInterface. Il primo incrementa il contatore, il secondo lo decrementa mentre l’ultimo effettua un Cast restituendo il puntatore alla nuova classe e contemporaneamente aumentando il contatore. Quando il programmatore non utilizza più un puntatore ad un oggetto esegue il metodo Release permettendo all’oggetto di capire che non è più utilizzato in quel punto. Quando il contatore scende a 0 allora l’interfaccia esegue il distruttore eliminando definitivamente l’oggetto. Questo aiuta nella gestione dell’allocazione e deallocazione delle risorse facilitando la gestione. I metodi AddRef e Release restituiscono il valore del contatore facilitando anche la visione dei punti in cui vengono creati riferimenti e non rilasciati. Ogni classe prevede oltre ai metodi un valore univoco chiamato GUID che identifica in modo univoco una classe. Il metodo QueryInterface utilizza la GUID per effettuare le conversioni che di fatto sono conversioni dinamiche. Ad esempio

ClasseA* A;

ClasseB* B;

HRESULT hr= A->QueryInterface(GUID_B,(void **)&A);

Se hr è diverso dalla costante S_OK significa che la conversione non è possibile.

Ogni oggetto DirectX deriva dall’interfaccia IUnknown. Nella SDK è mostrata per ogni classe le interfacce da cui deriva e da questo è possibile capire quali cast fare o non fare.

Importante nella programmazione è anche l’utilizzo dell’HRESULT. I metodi non lanceranno mai eccezioni, l’unico modo con cui vi segnaleranno se c’è un problema è tramite il velore restituito sotto forma di variabile HRESULT. Il valore S_OK significa appunto che il metodo è andato bene. Questo è fondamentale in fase di creazione delle risorse altrimenti si rischia di utilizzare puntatori errati e comunque creare blocchi nell’applicazione. Non tutti i metodi restituiscono eccezioni, questo significa che non vengono creati errori da bloccare l’applicazione ma potrebbero comunque verificarsi errori interni capaci di creare rallentamenti e addirittura blocchi dei driver della scheda video (se accade tranquilli, tempo qualche secondo e Windows li riavvia tornando alla normalità ed oscurando l’applicazioni). Per questo tipo di errori ci sono comunque sistemi per intercettarli.

Debug

Per effettuare il Debug in modo efficiente è necessario utilizzare il tool DirectX Control Panel. Nel pannello DirectX10.x/DirectX11 si utilizza il comando Edit List per selezionare gli eseguibili o le cartelle che il debugger DirectX controllerà. Il pannello output di visual studio a questo punto memorizzerà tutti gli errori ed i warning prodotti internamente da DirectX. Gli errori di DirectX infatti non sempre bloccano l’esecuzione e all’apparenza l’applicazione sembra funzionare, salvo poi accorgersi di pesanti rallentamenti o effetti non voluti. E’ possibile anche intercettare questi errori tramite tool esterni come ad esempio DebugView, un tool freeware fornito da SysInternal a questo link http://technet.microsoft.com/it-it/sysinternals/bb896647(en-us).aspx ma ne esistono comunque altri. Ricordatevi di togliere i vostri eseguibili dalla lista in quanto questi vengono rallentati durante l’esecuzione. Il sistema intercetta sia gli errori che i warning , situazioni che non generano errori ma che sono comunque non previste. Inoltre è possibile selezionare anche di inviare messaggi di informazioni (ad esempio tracciare quando ogni oggetto è creato e distrutto). Più avanti nei tutorial verrà spiegato anche come creare dei propri messaggi da lanciare al debugger.

Pix for Windows

Questo tool fornito nell’SDK permette di effettuare un debug sui vostri programmi. Vi basterà selezionare premere il tasto New Experiment, selezionare un eseguibile ed una delle modalità di verifica. A questo punto verrà lanciato l’eseguibile e alla chiusura avrete generato un report di quanto è accaduto. Ad esempio con la seconda opzione è possibile fare una istantanea del vostro programma ad ogni pressione del tasto F12. Quando il programma termina viene generato il report contenente un intero frame in cui poter vedere i metodi chiamati, i buffer associati ed il loro contenuto oltre al rendering parziale di ogni oggetto. Tramite questo tool è molto semplice vedere cosa di fatto sta accadendo. E’ anche possibile effettuare il debug del codice shader (purché questo sia compilato in modo opportuno). Al momento della stesura dell’articolo Pix non supporta a pieno tutte le caratteristiche di Direct3D11 ma nei prossimi rilasci sarà sicuramente risolto.

Ogni fornitore di hardware video fornisce in genere dei tool appositi per il controllo delle applicazioni Direct3D. Imparare ad utilizzare questi tool è diventato molto importante in quanto è negli shader e nei buffer che possono comparire dei colli di bottiglia e, dato che sono eseguiti internamente a Direct3D, non è possibile monitorarli.

Per gli utilizzatori .Net

Il wrapper lancia eccezioni solamente nei casi di errori riportati dagli HRESULT. Se tramite il DirectX Control Dialog l’eseguibile è stato associato allora nel contenuto dell’errore sarà riportato anche l’errore DirectX altrimenti avrete un errore generico. Gli errori interni però richiedono l’utilizzo di un programma come il DebugView. Ulteriore nota, selezionate l’intera cartella dove si trova l’eseguibile in quanto è il vhost ad essere da lanciato da Visual Studio quando si avvia un programma in debug e non l’eseguibile.