Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Mithilfe der Frame-Profilerstellung können Sie einige mögliche leistungsbezogene Probleme mit Vertex diagnostizieren. Im Bereich Befehle sehen Sie alle Draw-Aufrufe, die Ihr Spiel in einem bestimmten Frame ausführt, sowie die Anzahl der Primitive, die pro Draw-Aufruf gezeichnet werden. So lässt sich die Gesamtzahl der in einem einzelnen Frame eingereichten Knotenpunkte schätzen.
Abbildung 1. Frame-Profiling-Ansicht für einen einzelnen glDrawElements-Aufruf mit 2.718 gezeichneten Dreiecksprimitiven
Komprimierung von Vertex-Attributen
Ein häufiges Problem, das bei Ihrem Spiel auftreten kann, ist eine große durchschnittliche Scheitelpunktgröße. Eine große Anzahl von Scheitelpunkten, die mit einer hohen durchschnittlichen Scheitelpunktgröße übergeben werden, führt zu einer großen Bandbreite für das Lesen des Scheitelpunktspeichers, wenn die GPU ihn liest.
So sehen Sie sich das Vertex-Format für einen bestimmten Draw-Aufruf an:
Wählen Sie den gewünschten Ziehungsvorgang aus.
Das kann ein typischer Draw-Aufruf für die Szene, ein Draw-Aufruf mit einer großen Anzahl von Eckpunkten, ein Draw-Aufruf für ein komplexes Charaktermodell oder ein anderer Typ von Draw-Aufruf sein.
Gehen Sie zum Bereich Pipeline und klicken Sie auf IA für die Eingabe-Assembly.
Damit wird das Vertex-Format für die in die GPU eingehenden Vertices definiert.
Beobachten Sie eine Reihe von Attributen und deren Formaten. R32G32B32_SFLOAT ist beispielsweise ein 3-Komponenten-Gleitkommawert mit 32 Bit und Vorzeichen.
Abbildung 2. Eingabe-Assembly für einen Zeichenaufruf mit unkomprimierten Attributen, die zu einer Vertex-Größe von 56 Byte führen
Häufig lassen sich Vertex-Attribute komprimieren, ohne dass die Qualität der gerenderten Modelle wesentlich beeinträchtigt wird. Wir empfehlen insbesondere:
Komprimieren der Eckpunktposition auf 16-Bit-Gleitkommazahlen mit halber Genauigkeit
UV-Texturkoordinaten in 16-Bit-Ganzzahlen ohne Vorzeichen komprimieren
Kompression des Tangentenraums durch Codierung von Normal-, Tangenten- und Binormalvektoren mit Quaternionen
Auch andere verschiedene Attribute können für Typen mit geringerer Genauigkeit im Einzelfall berücksichtigt werden.
Vertex-Stream-Aufteilung
Sie können auch prüfen, ob Vertex-Attributstreams richtig aufgeteilt sind. Bei Architekturen mit gekachelter Darstellung wie mobilen GPUs werden Scheitelpunktpositionen zuerst in einem Binning-Pass verwendet, um Bins von Primitiven zu erstellen, die in jeder Kachel verarbeitet werden. Wenn Vertex-Attribute in einem einzigen Puffer verschachtelt sind, werden alle Vertex-Daten zum Binning in den Cache gelesen, obwohl nur Vertex-Positionen verwendet werden.
Um die Speicherbandbreite für das Lesen von Knoten zu reduzieren und die Cache-Effizienz zu verbessern und so die für den Binning-Pass benötigte Zeit zu verkürzen, sollten Knotendaten in zwei separate Streams aufgeteilt werden: einen für Knotenpositionen und einen für alle anderen Knotenattribute.
So prüfen Sie, ob Vertex-Attribute richtig aufgeteilt sind:
Wählen Sie den gewünschten Draw-Call aus und notieren Sie sich die Draw-Call-Nummer.
Das kann ein typischer Draw-Aufruf für die Szene, ein Draw-Aufruf mit einer großen Anzahl von Eckpunkten, ein Draw-Aufruf für ein komplexes Charaktermodell oder ein anderer Typ von Draw-Aufruf sein.
Gehen Sie zum Bereich Pipeline und klicken Sie auf IA für die Eingabe-Assembly. Damit wird das Vertex-Format für Vertices definiert, die in die GPU gelangen.
Beachten Sie die Bindungen Ihrer Vertex-Attribute. In der Regel steigen sie linear an (0, 1, 2, 3 usw.), aber das ist nicht immer der Fall.
Die Vertex-Position ist in der Regel das erste aufgeführte Vertex-Attribut.
Suchen Sie im Bereich State nach LastDrawInfos und maximieren Sie die entsprechende Ziehungsnummer. Maximieren Sie dann das BoundVertexBuffers für diesen Zeichenaufruf.
Sehen Sie sich die Vertex-Puffer an, die während des angegebenen Zeichenaufrufs gebunden sind. Die Indexe entsprechen den Bindungen für Vertex-Attribute von zuvor.
Erweitern Sie die Bindungen für die Vertex-Attribute Ihres Draw-Aufrufs und erweitern Sie die Puffer.
Sehen Sie sich die VulkanHandle für die Puffer an, die den zugrunde liegenden Speicher darstellen, aus dem die Vertex-Daten stammen. Wenn sich die VulkanHandle unterscheiden, stammen die Attribute aus unterschiedlichen zugrunde liegenden Puffern. Wenn die VulkanHandles gleich sind, die Offsets aber groß sind (z. B. größer als 100), stammen die Attribute möglicherweise trotzdem aus verschiedenen Unterpuffern. Dies erfordert jedoch weitere Untersuchungen.
Abbildung 3. Eingabe-Assembly für einen Draw-Aufruf. Das Statusfeld rechts zeigt, dass die Attribute an den Bindungen 0 und 1, der Eckpunktposition und der Normalen einen gemeinsamen zugrunde liegenden Puffer haben.
Weitere Informationen zum Aufteilen von Vertex-Streams und zur Behebung des Problems in verschiedenen Spiele-Engines finden Sie in unserem Blogpost zu diesem Thema.
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2025-07-27 (UTC).
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Benötigte Informationen nicht gefunden","missingTheInformationINeed","thumb-down"],["Zu umständlich/zu viele Schritte","tooComplicatedTooManySteps","thumb-down"],["Nicht mehr aktuell","outOfDate","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Problem mit Beispielen/Code","samplesCodeIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 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."]]