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.
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:
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.
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.
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.
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:
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.
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.
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.
Nel riquadro Stato, individua
LastDrawInfos
ed espandi il numero di chiamata dell'estrazione corrispondente. Quindi, espandiBoundVertexBuffers
per questa chiamata di disegno.Osserva i buffer del vertice associati durante la chiamata di disegno, con gli indici che corrispondono alle associazioni degli attributi del vertice precedenti.
Espandi le associazioni per gli attributi del vertice della chiamata di disegno ed espandi i buffer.
Osserva il
VulkanHandle
per i buffer, che rappresentano la memoria sottostante da cui provengono le origini dati del vertice. SeVulkanHandle
sono diversi, significa che gli attributi provengono da buffer sottostanti diversi. Se gli attributiVulkanHandle
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.
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.