我正在努力掌握数据导向设计以及如何在编程时更好地考虑缓存。基本上有两种情况,我还不能确定哪一种更好,也不知道原因 - 是使用对象的向量好,还是使用几个包含对象原子数据的向量比较好?
A) 对象向量示例
struct A
{
GLsizei mIndices;
GLuint mVBO;
GLuint mIndexBuffer;
GLuint mVAO;
size_t vertexDataSize;
size_t normalDataSize;
};
std::vector<A> gMeshes;
for_each(gMeshes as mesh)
{
glBindVertexArray(mesh.mVAO);
glDrawElements(GL_TRIANGLES, mesh.mIndices, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
....
}
B) 具有原子数据的向量
std::vector<GLsizei> gIndices;
std::vector<GLuint> gVBOs;
std::vector<GLuint> gIndexBuffers;
std::vector<GLuint> gVAOs;
std::vector<size_t> gVertexDataSizes;
std::vector<size_t> gNormalDataSizes;
size_t numMeshes = ...;
for (index = 0; index++; index < numMeshes)
{
glBindVertexArray(gVAOs[index]);
glDrawElements(GL_TRIANGLES, gIndices[index], GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
....
}
哪个更具有内存效率和缓存友好性,从而导致较少的缓存未命中和更好的性能,并为什么?
GL_UNSIGNED_SHORT
作为索引数据类型。在GPU中,如果你的顶点数少于65537个,你可以通过使用16位索引来提高后T&L缓存和标记的效率。你可能认为对于少于257个顶点的缓冲区,8位索引逻辑上会更进一步提高性能,但大多数硬件不支持本地8位索引。 - Andon M. Coleman