Decir que tengo un modelo formado por los vértices, cada uno con position
, normal
, tangent
, y texcoord
atributos, en los triángulos son especificados por los triples de índice.
Si solo nos centramos en los atributos del vértice, conozco dos estrategias generales: la estructura de las matrices y la matriz de estructuras. También escuché que se prefiere la matriz de estructuras porque aumenta la localidad de memoria (y por lo tanto la localidad de caché) de los atributos para un vértice dado.
¿Es realmente el caso que esto mejora el rendimiento? La forma principal en que podría pensar que esto ocurriría es mediante índices de vértices que requieren que el rasterizador adquiera datos de vértices que desde hace mucho tiempo han sido expulsados de la caché. Si el acceso a los datos de vértice es aleatorio como este, entonces mantener todos los atributos para un vértice en la misma línea de caché sin duda agilizaría las cosas, pero ¿no es este un problema que podría mitigarse principalmente al optimizar el orden de la especificación del triángulo?
Además, entiendo que las GPU modernas pueden ser mejores para desempaquetar vectores largos del mismo tipo, que los vectores de estructuras de muchos tipos. ¿Sería posible que un diseño de estructura de matrices supere consistentemente un diseño de matriz de estructuras de los mismos datos de vértice, si el orden del índice está optimizado?
fuente
Respuestas:
Disculpas, iba a agregar un comentario a su hilo de preguntas, pero descubrí que terminé elaborando demasiado. Mi experiencia de desarrollo es desde una perspectiva DX 11, por lo que es posible que parte de esto no se mantenga en OpenGL
La localidad de memoria de los datos ciertamente juega un papel importante. Pero hay algunos otros elementos que juegan en esto, el ancho de los datos como ustedes saben. He tenido algunas GPU y he tenido un gran rendimiento en algunos basado en ciertos puntos de inflexión. Ese es, por ejemplo, en mi viejo AMD r290, si recuerdo, básicamente podría pasar hasta 4 float4s al búfer de vértices sin costo adicional por encima de 1, pero una vez que publiqué> 4, hubo una caída medible (en el marco Velocidad). Esto está puramente fuera de mi recuerdo y también es anecdótico. Pero sostiene que la arquitectura de la GPU está cambiando todo el tiempo, y qué técnicas de nicho que le brindan una ventaja de rendimiento hoy pueden ser la ruina de su rendimiento mañana. YO'
Dicho esto, ha formulado la pregunta sobre el orden de los vértices, y ciertamente eso ayudará marginalmente. La ganancia de rendimiento es cuando se combina esto con buffers de índice que luego permiten al hardware optimizar y almacenar en caché los vértices ya calculados. Ciertamente, puede obtener aún más ganancias de las tiras triangulares, etc., que se ordenaron específicamente según sus pensamientos. La mayoría de las representaciones de modelos que hago son modelos optimizados basados en índices / vértices con instancias, utilizo una pequeña cantidad de búsquedas de efectos de movimiento cíclicos (ramas de árbol, por ejemplo), en estos casos, toda la rama del árbol está buscando el mismo valor. Por lo tanto, el almacenamiento en caché se puede aprovechar aquí también.
Todo lo que puedo decir en resumen de mí mismo es:
Estos son solo algunos pensamientos y experiencias que he tenido. Hay muchos libros por ahí en los que debería tener acceso a estos temas. No he visto a muchos prescribir lo que está proponiendo, pero eso no significa que esté mal. Buena suerte.
fuente
Esto puede depender del hardware de destino y la API que va a utilizar. ¿Puedes proporcionar más información? Aquí hay algunas mejores prácticas (muy amplias y generales) para OpenGL. https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices
Además, ¿tienes un problema de rendimiento? ¿O simplemente tienes curiosidad?
fuente