Debugging Avanzato in DirectX 2047 Visite) Tips and tricks
Le ultime versioni di Visual Studio includono un comodissimo tool per testare in modo approfondito le applicazioni DirectX.
Avviate la vostra applicazione Direct3D tramite il menu Start Diagnostics (o Alt+F5)
L’applicazione si avvierà sotto il controllo di questo strumento
Qui già verranno evidenziati il numero di frame al secondo che la vostra applicazione sta generando. Premete sul pulsante Capture Frame o più comodamente il pulsante Stamp della tastiera.
Questo processo catturerà un fotogramma della scena. A questo punto potete chiudere l’applicazione e vedere cosa Visual Studio ha estratto.
Come vedete è stato estratto un frame della scena (con tanto di preview). Premete quindi sul link (Frame XXXXX, che è il numero di frame da quando l’applicazione si è avviata). Vi ritroverete nel Visual Studio Graphics Analyzer, uno strumento con diversi pannelli che mostrano lo stato dell'applicazione in quel frame.
A sinistra nella graphics event list avrete l’elenco delle chiamate a Direct3D avvenute in quel frame. Potete raggrupparle per DrawEvents (Clear, Draw e Present) o per TimeLine (che mostrerà tutti gli eventi).
Ogni link che vedete sulla lista segnato come obj:xx è oggetto di Direct3D. Potrete così controllare il contenuto di ogni elemento caricato e generato.
Se premerete sul l’oggetto obj:xx->DrawIndexed ad esempio potrete verificare lo stato del Device al momento della Draw in modo da vedere tutti i buffer, shader e proprietà impostati al momento del draw.
Altra cosa molto interessante è la possibilità di fare Debug degli Shader (a patto che li abbiate compilati con l’opzione Debug attivata).
Come vedete è possibile confrontare il codice Shader che abbiamo scritto noi con il compilato in assembler.
Nel Tab Render Target premete su un punto della scena ed attivate il Graphics Pixel History: come dice il nome vedrete la storia di quel pixel durante il rendering.
Sul tab a sinistra potrete premete su uno degli shader e mettere un punto di break point quindi fate play (sempre sulla graphics pixel history).
Non potrete usare il classico controllo immediato (quick watch) ma tutte le variabili compaiono comunque in basso nel tab Locals con i valori al punto del break point. Potrete facilmente capire perchè il vostro oggetto non si comporta come prevedevate.
Potrete addirittura modificare al volo lo Shader e fare test.
Attivando il PipelineState (sempre tasto destro sull’immagine o sulla drawIndexed) vedrete anche una immagine di ciò che succede durante l’esecuzione dello shader
L’ultimo comando che vi mostro (perché c’è ne sono veramente tanti) è il Frame Analysis che restituisce un report con tutti i tempi in nanosecondi che sono stati impiegati in ogni fase di rendering (utilissimo per capire dove rallenta la nostra applicazione). Vi basterà selezionare il tab Frame Analysis e far partire la procedura. In pochi secondi estrarrà tutti i dati.
Consiglio di imparare a padroneggiare questo strumento che rappresenta uno dei migliori metodi per capire cosa sta succedendo in applicazioni realizzate con DirectX.