Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
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.
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:
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.
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:
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, espandi BoundVertexBuffers 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. 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.
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.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-27 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2025-07-27 UTC."],[],[],null,["# Analyze vertex formats\n\nYou may diagnose a few possible vertex-related performance problems through the\nuse of frame profiling. Use the **Commands** pane to view all of the draw calls\nyour game performs in a given frame and counts of primitives drawn per draw\ncall. This can give an approximation of the overall number of vertices submitted\nin a single frame.\n**Figure 1.** Frame profiling view for a single `glDrawElements` call, showing 2,718 triangle primitives drawn\n\nVertex attribute compression\n----------------------------\n\nOne common problem your game may face is a large average vertex size. A\nlarge number of vertices submitted with a high average vertex size results in a\nlarge vertex memory read bandwidth when read by the GPU.\n\nTo observe the vertex format for a given draw call, complete the following steps:\n\n1. Select a draw call of interest.\n\n This can be a typical draw call for the scene, a draw call with a large\n number of vertices, a draw call for a complex character model, or some other\n type of draw call.\n2. Navigate to the **Pipeline** pane, and click **IA** for input assembly.\n This defines the vertex format for vertices coming into the GPU.\n\n3. Observe a series of attributes and their formats; for example,\n `R32G32B32_SFLOAT` is a 3-component 32-bit signed float.\n\n**Figure 2.**Input assembly for a draw call, with uncompressed attributes resulting in a vertex size of 56 bytes\n\nFrequently, vertex attributes can be compressed with minimal reduction in the\nquality of the models drawn. In particular, we recommend:\n\n- Compressing vertex position to half-precision 16-bit floats\n- Compressing UV texture coordinates to 16-bit unsigned integer ushorts\n- Compressing the tangent space by encoding normal, tangent, and binormal vectors using quaternions\n\nOther miscellaneous attributes may also be considered for lower-precision types\non a case-by-case basis.\n\nVertex stream splitting\n-----------------------\n\nYou can also investigate whether vertex attribute streams are appropriately\nsplit. On tiled rendering architectures such as mobile GPUs, vertex positions\nare first used in a binning pass to create bins of primitives processed in each\ntile. If vertex attributes are interleaved into a single buffer, all vertex data\nis read into cache for binning, even though only vertex positions are used.\n\nTo reduce vertex read memory bandwidth and improve cache efficiency, and thus\nreduce time spent on the binning pass, vertex data should be split into two\nseparate streams, one for vertex positions, and one for all other vertex\nattributes.\n\nTo investigate whether vertex attributes are appropriately split:\n\n1. Select a draw call of interest, and note the draw call number.\n\n This can be a typical draw call for the scene, a draw call with a large\n number of vertices, a draw call for a complex character model, or some other\n type of draw call.\n2. Navigate to the **Pipeline** pane, and click **IA** for input assembly. This\n defines the vertex format for vertices coming into the GPU.\n\n3. Observe the bindings of your vertex attributes; typically these might\n increase linearly (0, 1, 2, 3, etc.), but this is not always the case.\n Vertex position is typically the first vertex attribute listed.\n\n4. In the **State** pane, find the `LastDrawInfos` and expand the matching draw\n call number. Then, expand the `BoundVertexBuffers` for this draw call.\n\n5. Observe the vertex buffers bound during the given draw call, with indices\n matching the vertex attribute bindings from earlier.\n\n6. Expand the bindings for your draw call's vertex attributes, and expand the\n buffers.\n\n7. Observe the `VulkanHandle` for the buffers, which represent the underlying\n memory that the vertex data sources from. If the `VulkanHandle`s are\n different, this means the attributes originate from different underlying\n buffers. If the `VulkanHandle`s are the same but the offsets are large\n (for example, greater than 100), the attributes may still originate from\n different sub-buffers, but this requires further investigation.\n\n**Figure 3.**Input assembly for a draw call, with the state panel to the right showing that the attributes at binding 0 and 1, vertex position and normal, share a single underlying buffer\n\nFor more detail about vertex stream splitting and how to resolve it on various\ngame engines, see our [blog post](/agi/frame-trace/link-to-Omars-blog-post) on the subject."]]