Analizza i formati dei vertici

Puoi diagnosticare alcuni possibili problemi di prestazioni relativi al vertice utilizzando la profilazione del frame. Usa il riquadro Comandi per visualizzare tutte le chiamate di disegno eseguite dal gioco in un determinato frame e il numero di primitive disegnate per chiamata. Questo può fornire un'approssimazione del numero totale di vertici inviati in un singolo frame.

Visualizzazione di profilazione del frame per una chiamata glDrawElements, su cui è stato passato il mouse per visualizzare i dettagli sui parametri della chiamata di disegno
Figura 1. Visualizzazione di profilazione del frame per una singola chiamata glDrawElements, che mostra 2718 primitive triangolari disegnate

Compressione attributo vertice

Un problema comune che il tuo gioco potrebbe affrontare è la dimensione media del vertice. Un elevato numero di vertici inviati con una dimensione del vertice media elevata genera un'elevata larghezza di banda di lettura della memoria del vertice quando viene letta dalla GPU.

Per osservare il formato del vertice per una determinata chiamata di disegno, procedi nel seguente modo:

  1. Seleziona una chiamata di disegno che ti interessa.

    Si tratta di una chiamata di disegno tipica per la scena, una chiamata di disegno con un numero elevato di vertici, una chiamata di disegno per un modello di caratteri complesso o un altro tipo di richiamo di disegno.

  2. Vai al riquadro Pipeline e fai clic su IA per l'assemblaggio di input. Definisce il formato dei vertici per i vertici che entrano nella GPU.

  3. Osserva una serie di attributi e i relativi formati; ad esempio, R32G32B32_SFLOAT è un numero in virgola mobile a 32 bit firmato a 3 componenti.

Visualizzazione profilazione del frame per l'assemblaggio di input di una chiamata di disegno, con attributi del vertice non compressi
Figura 2. Assemblaggio di input per una chiamata di disegno, con attributi non compressi che generano una dimensione verticale di 56 byte

Spesso, gli attributi dei vertici possono essere compressi con una riduzione minima della qualità dei modelli tracciati. In particolare, consigliamo di:

  • Compressione della posizione del vertice in valori a virgola mobile a 16 bit a precisione intermedia
  • Compressione delle coordinate delle texture UV in ushort interi senza segno a 16 bit
  • Compressione dello spazio della tangente mediante la codifica di vettori normali, tangenti e binormali utilizzando i quaternioni

Anche altri attributi vari possono essere presi in considerazione caso per caso per tipi di precisione inferiore.

Suddivisione del flusso di Vertex

Puoi anche verificare se i flussi di attributi vertex sono correttamente suddivisi. Sulle architetture di rendering a mosaico, come le GPU mobile, le posizioni dei vertici vengono prima utilizzate in un passaggio di binning per creare bin di primitive elaborate in ogni riquadro. Se gli attributi dei vertici vengono interlacciati in un unico buffer, tutti i dati dei vertici vengono letti nella cache per il binning, anche se vengono utilizzate solo le posizioni dei vertici.

Per ridurre la larghezza di banda della memoria di lettura del vertice e migliorare l'efficienza della cache, in modo da ridurre il tempo dedicato al passaggio di binning, i dati dei vertici devono essere suddivisi in due flussi separati, uno per le posizioni dei vertici e uno per tutti gli altri attributi del vertice.

Per verificare se gli attributi del vertice sono suddivisi correttamente:

  1. Seleziona una chiamata di disegno che ti interessa e prendi nota del numero di chiamata.

    Si tratta di una chiamata di disegno tipica per la scena, una chiamata di disegno con un numero elevato di vertici, una chiamata di disegno per un modello di caratteri complesso o un altro tipo di richiamo di disegno.

  2. Vai al riquadro Pipeline e fai clic su IA per l'assemblaggio di input. Questo definisce il formato dei vertici per i vertici in entrata nella GPU.

  3. Osserva le associazioni degli attributi dei vertici; in genere potrebbero aumentare in modo lineare (0, 1, 2, 3 e così via), ma non sempre. La posizione del vertice è in genere il primo attributo del vertice elencato.

  4. Nel riquadro Stato, individua LastDrawInfos ed espandi il numero di chiamata dell'estrazione corrispondente. Quindi, espandi BoundVertexBuffers per questa chiamata di disegno.

  5. Osserva i buffer del vertice associati durante la chiamata di disegno, con gli indici che corrispondono alle associazioni degli attributi del vertice precedenti.

  6. Espandi le associazioni per gli attributi del vertice della chiamata di disegno ed espandi i buffer.

  7. Osserva il VulkanHandle per i buffer, che rappresentano la memoria sottostante da cui provengono le origini dati del vertice. Se VulkanHandle sono diversi, significa che gli attributi provengono da buffer sottostanti diversi. Se gli attributi VulkanHandle sono uguali, ma gli offset sono grandi (ad esempio, maggiori di 100), gli attributi potrebbero comunque provenire da buffer secondari diversi, ma ciò richiede ulteriori indagini.

Visualizzazione profilazione del frame per l'assemblaggio e lo stato di input di una chiamata di disegno che mostra il buffer del vertice associato
Figura 3. Assemblaggio di input per una chiamata di disegno, con il riquadro di stato a destra che mostra che gli attributi nell'associazione 0 e 1, nella posizione del vertice e nella norma condividono un singolo buffer sottostante

Per ulteriori dettagli sulla suddivisione dello stream Vertex e su come risolverla su vari motori di gioco, consulta il post del nostro blog sull'argomento.