Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Puedes diagnosticar algunos problemas de rendimiento relacionados con los vértices mediante la generación de perfiles de fotogramas. Usa el panel Commands para ver todas las llamadas de dibujo que realiza tu juego en un fotograma determinado y los recuentos de primitivas dibujadas por llamada de dibujo. Esto puede brindar una aproximación de la cantidad total de vértices enviados en un solo fotograma.
Figura 1: Vista de perfil de fotogramas para una sola llamada a glDrawElements, que muestra 2,718 primitivas de triángulo dibujadas
Compresión de atributos de Vertex
Un problema común que puede enfrentar tu juego es un gran tamaño promedio de vértices. Una gran cantidad de vértices enviados con un tamaño de vértice promedio alto genera un gran ancho de banda de lectura de memoria de vértices cuando lo lee la GPU.
Para observar el formato de vértice de una llamada de dibujo determinada, completa los siguientes pasos:
Selecciona una llamada de interés para dibujar.
Puede ser una llamada de dibujo típica para la escena, una llamada de dibujo con una gran cantidad de vértices, una llamada de dibujo para un modelo de personaje complejo o algún otro tipo de llamada de dibujo.
Navega al panel Pipeline y haz clic en IA para el ensamblado de entrada.
Esto define el formato de vértice para los vértices que llegan a la GPU.
Observa una serie de atributos y sus formatos; por ejemplo, R32G32B32_SFLOAT es un número de punto flotante de 32 bits firmado de 3 componentes.
Figura 2: Conjunto de entrada para una llamada de dibujo con atributos sin comprimir, lo que da como resultado un tamaño de vértice de 56 bytes
Con frecuencia, los atributos de vértices se pueden comprimir con una reducción mínima en la calidad de los modelos dibujados. En particular, te recomendamos lo siguiente:
Comprime la posición de los vértices a números de punto flotante de 16 bits de precisión media
Compresión de coordenadas de texturas UV en ushorts de números enteros sin firma de 16 bits
Comprimir el espacio tangente mediante la codificación de vectores normales, tangentes y binormales mediante cuaterniones
Otros atributos varios también pueden considerarse para tipos de menor precisión según el caso.
División de transmisión de Vertex
También puedes investigar si las transmisiones de atributos de Vertex se dividieron de forma correcta. En las arquitecturas de renderización en mosaico, como las GPU para dispositivos móviles, las posiciones de los vértices se usan por primera vez en un pase de discretización para crear discretizaciones de primitivas procesadas en cada tarjeta. Si los atributos de vértices se intercalan en un solo búfer, todos los datos de vértices se leen en la caché para la discretización, aunque solo se usen las posiciones de vértices.
Para reducir el ancho de banda de la memoria de lectura de vértices y mejorar la eficiencia de la caché y, así, reducir el tiempo dedicado al pase de discretización, los datos de vértices deben dividirse en dos transmisiones separadas: una para las posiciones de vértices y otra para todos los demás atributos de vértices.
Sigue estos pasos para investigar si los atributos de Vertex se dividieron de forma correcta:
Selecciona una llamada de interés y anota el número correspondiente.
Puede ser una llamada de dibujo típica para la escena, una llamada de dibujo con una gran cantidad de vértices, una llamada de dibujo para un modelo de personaje complejo o algún otro tipo de llamada de dibujo.
Navega al panel Pipeline y haz clic en IA para el ensamblado de entrada. Esto define el formato de vértice para los vértices que llegan a la GPU.
Observa las vinculaciones de tus atributos de vértices; por lo general, estos pueden aumentar de forma lineal (0, 1, 2, 3, etc.), pero no siempre es así.
La posición de los vértices suele ser el primer atributo de Vertex que aparece en la lista.
En el panel State, busca el LastDrawInfos y expande el número de llamada de dibujo correspondiente. Luego, expande el objeto BoundVertexBuffers de esta llamada de dibujo.
Observa los búferes de Vertex vinculados durante la llamada de dibujo determinada, con índices que coinciden con las vinculaciones de atributos de Vertex anteriores.
Expande las vinculaciones de los atributos de vértices de tu llamada de dibujo y los búferes.
Observa el VulkanHandle de los búferes, que representan la memoria subyacente de la que provienen los datos de vértices. Si los VulkanHandle son diferentes, esto significa que los atributos se originan de diferentes búferes subyacentes. Si los VulkanHandle son iguales, pero los desplazamientos son grandes (por ejemplo, mayores que 100), es posible que los atributos aún se originen en diferentes subbúferes, pero esto requiere más investigación.
Figura 3: Conjunto de entrada para una llamada de dibujo, con el panel de estado a la derecha que muestra que los atributos en la vinculación 0 y 1, la posición del vértice y la normal, comparten un solo búfer subyacente.
Para obtener más detalles sobre la división de transmisión de vértices y cómo resolverla en varios motores de juegos, consulta nuestra entrada de blog sobre el tema.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 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."]]