Home Page Home Page Articoli Debbugging di applicazioni DirectX

Debbugging di applicazioni DirectX

Consigli e strategie per il Debugging delle applicazioni DirectX.
Autore: Stefano Cristiano Livello:
Ecco qui una lista degli errori più comuni commessi quando si inizia a programmare in DirectX. Vi consiglio vivamente di leggerli e seguire i consigli proposti, perché essi sono (aimè) dettati dall’esperienza personale del sottoscritto dopo davvero tante ore di duro lavoro…

Regola numero 0
In realtà questa è una regola generale della programmazione: prima fate funzionare le cose, POI OTTIMIZZATE. Se tentate di ottimizzare da subito in dx, vi assicuro che non vedrete nient’altro oltre lo schermo nero per un bel po’ di tempo, senza capire “cosa c’e’ che non funziona” nel vostro programma. Ci sono troppe cose da tenere a bada,non si puo’ pensare di ottimizzarle da subito. E ricordate che vige sempre FMIWTMIF (First make it work,than make it Fast)

Regola numero 1
Controllare SEMPRE gli HRESULT restituiti da una chiamata di metodo durante lo sviluppo. Magari usato delle macro, in modo da escludere i controlli nelle chiamate più “importanti” (ad esempio le varie DrawPrimitive) durante la compilazione della Release Version. Esiste una funzione chiamata DXGetErrorString8 che dato un HRESULT restituisce una stringa contenente una descrizione più o meno significativa dell’errore. Nel nostro codice utilizzeremo delle macro che controllano l’HRESULT e interrompono l’esecuzione del programma, nel caso qualcosa sia andato storto (tipo CHECKHR e CHECKHR_VOID).

Regola numero 2
Utilizzare la versione di Debug delle DirectX. Come è stato già detto nell’installazione del DXSDK viene chiesto se installare DirectX in versione Retail o Debug. La versione Debug è un po’ più lenta di quella Retail poichè effettua un meticoloso controllo degli errori sui parametri passati a tutti i metodi degli oggetti DirectXGraphics. Ovviamente questo è uno dei più preziosi strumenti che abbiamo a disposizione e dobbiamo approfittarne. Quando trova errori o anomalie scrive dei messaggi sul terminale di debug dell’applicazione. Se state usando Visual C++ questi messaggi li potete vedere alla fine del programma quando effettuate il Debug dell’applicazione.



In questo shot ho passato apposta 1 parametro sbagliato alla IDirect3Ddevice8::CreateDevice(…) (l’adapter) e vedete come nella finestra di log del VisualC++ viene indicata la causa esatta dell’errore. Se vedete messaggi d’errore particolarmente criptici segnalateli alla http://discuss.microsoft.com/archives/DIRECTXDEV.html ">Mailing List Ufficiale delle DirectX.

Potete anche cambiare il numero e il tipo di messaggi che volete vi siano segnalati attraverso uno slider posto nel pannello di controllo directx. Spostando lo slider le potete passare dalla modalità di segnalazione di “Solo Errori” a modalità dove vi segnala anche consigli x migliorare le performance etc etc. Se mettete lo slider al massimo (more) probabilmente riceverete una CATERVA di messaggi (molti dei quali poco utili)



Regola numero 3
Controllare il comportamento del Reference Rasterizer. Programmare videogiochi 3D per PC non è semplice perché bisogna spesso tener conto che il nostro gioco dovrà girare su altri PC, che potrebbero avere altri acceleratori video, altri processori etc. Oltre a questo i drivers, ovverosia quei componenti software che fanno da tramite tra DirectX e la vostra scheda video, potrebbero presentare dei bug e causare anomalie nei risultati a schermo che non dipendono da nostri errori. Proprio per questo motivo Microsoft ha creato un driver “virtuale” chiamato Reference Rasterizer che è il riferimento assoluto per la programmazione 3D in DXG. Se il nostro programma si comporta differentemente usando il Reference Rasterizer e rispetto a quando sfruttiamo l’accelerazione, allora possiamo essere più che certi che il driver del nostro acceleratore ha un bug. Quando succede questo, è bene fare una segnalazione alla casa di produzione e attendere il rilascio nuove versioni corrette dei drivers.

Il Reference Rasterizer non è stato programmato pensando all’ottimizzazione ma esclusivamente alla correttezza dell’output a schermo per il debugging delle applicazioni. Non è pensabile utilizzare il RefRast come modulo software da usare quando non è presente l’accelerazione hardware.

Per usare il reference rasterizer basta passare D3DDEVTYPE_REF nella CreateDevice al posto di D3DDEVTYPE_HAL che indica l’accelerazione hardware.


HRESULT hr;
hr = g_d3d->CreateDevice( D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,
g_hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
¶ms,&g_device.p);



Regola numero 4
Debuggate il vostro programma in finestra, in questo modo se impostate dei break durante il rendering nel debugger non si pianta il sistema…Usate la modalita’ fullscreen solo x il rilascio del prodotto finale.
Voto medio articolo: 5.0 Numero Voti: 1
Stefano Cristiano

Stefano Cristiano

3D Coder. Sto lavorando ad un engine chiamato "Muse Engine" di cui potete leggere al mio sito http://pagghiu.gameprog.it Profilo completo

Articoli collegati

Integrare le Direct3D 8.1 con MFC Usando Visual Studio 6.0
In questo articolo mostreremo come creare una semplice applicazione SDI (Single Document Interface), in cui mostrare un oggetto tridimensionale in formato *.X e di farlo ruotare intorno all'asse Y.
Autore: Biagio Iannuzzi | Difficoltà:
Particle System
Brevi cenni su come implementare un particle system in DirectX
Autore: Stefano Cristiano | Difficoltà: | Voto:
Texture Blending (Parte II) Quake 3 Arena Shader System
Questo articolo è simile alla Parte I e ripete molti aspetti però tratta anche un pò degli shaders di Quake 3 Arena.
Autore: Stefano Cristiano | Difficoltà: | Voto:
Texture Blending (Parte I)
Come gestire gli effetti di blending tra texture. Multitexturing e Multipassing. Effect Files
Autore: Stefano Cristiano | Difficoltà: | Voto:
Sprite
Come creare uno "sprite" e animarlo. Special thanks to Elevator2 per gli sprites di megaman
Autore: Stefano Cristiano | Difficoltà: | Voto:
Texture
Introduzione al concetto di texture, di coordinate texture. Come animare le coordinate texture
Autore: Stefano Cristiano | Difficoltà:
Grafica 2D in DirectX. Vertex Buffers
Introduzione alla grafica 2D. Utilizzo dei vertex buffers
Autore: Stefano Cristiano | Difficoltà: | Voto:
Framework DXGWrapper
Spiega la filosofia di fondo del framework ideato dal sottoscritto ed usato da tutti i samples degli articoli relativi a DirectX.
Autore: Stefano Cristiano | Difficoltà: | Voto:
Gamma Correction e Colori
Una trattazione breve ma con una base matematica che spiega in parole povere il problema del fattore gamma e i colori in generale
Autore: Stefano Cristiano | Difficoltà: | Voto:
Inizializzazione e schermo
Si parla dell'inizializzazione dello schermo e delle modalità video in DirectX e di come gestire gli eventi "lost device", come scrivere un Game Loop e alcune info sul VSYNC
Autore: Stefano Cristiano | Difficoltà: | Commenti: 1 | Voto:
Introduzione a DirectX
Introduzione al mondo DirectX , requisiti, tools necessari, configurazione dell’ambiente di sviluppo.
Autore: Stefano Cristiano | Difficoltà: | Commenti: 2 | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5