Home Page Twitter Facebook Feed RSS
NotJustCode
Apri

Query 1441 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)