Query 1479 Visite) DirectX 11
Tra le funzionalità di Direct3D11 una da non sottovalutare è quella di poter interrogare il sistema su quello che sta succedendo, le cosiddette Queries. Data la dinamicità degli ambienti è difficile capire quanti pixel sono stati elaborati o se un oggetto è nascosto da un altro. Queste informazioni possono essere utili magari per capire dove ottimizzare il codice o addirittura per decidere il comportamento dell’applicazione in base ai risultati.
Iniziamo a creare un oggetto Query
Query pipelineQuery = new Query(Device, new QueryDescription() { Flags = QueryFlags.None, Type = QueryType.PipelineStatistics });
In questo esempio è stata creata una query per l’analisi statistica sulla Pipeline (esempio, quanti pixel sono renderizzati)
Quindi attiviamo la lettura
DeviceContext.Begin(pipelineQuery);
Da questo momento DirectX sta registrando ciò che accade. Per interrompere la lettura
DeviceContext.End(pipelineQuery);
Ora la pipelineQuery ha tutte le informazioni. Per leggere le informazioni è sufficiente
QueryDataPipelineStatistics stats = new QueryDataPipelineStatistics();
while (!DeviceContext.GetData<QueryDataPipelineStatistics>(pipelineQuery, AsynchronousFlags.None, out stats))
{
}
I dati non sono pronti istantaneamente, quindi occorre eseguire più volte il metodo GetData per sapere che i dati sono pronti e quindi inseriti nella variabile.
Ora la variabile stats ha tutta una serie di informazioni pronte all’uso, come ad esempio:
- stats.IAPrimitiveCount (numero di triangoli renderizzati)
- stats.PSInvocationCount (numero di esecuzioni del pixel shader)
- stats.IAVerticeCount (numero di vertici)
Vi rimando al tutorial numero 17 della serie (Github o in fondo dal primo tutorial)