是否一次分配多个对象

Allocate multiple objects at once or not

OpenGL 具有可以一次创建多个对象的函数

glCreateBuffers(1,&handle);
...
glDeleteBuffers(1,&handle);

我想这样做的目的是为了节省一次 create/destroy 所有对象的时间。但这只是在初始化时,还是会影响内存布局,例如增加局部性,从而缩短渲染时间。

这个问题被标记为重复之前,这个问题是关于 object 创建 ARB_direct_state_access,而不是 name creation, RetoKoradi 评价是廉价的

VRAM 不是磁盘,它是 Random Access Memory . OpenGL 不需要扫描它就可以到达它上面的东西。通常有一个内存 table 存储在某处,它跟踪缓冲区和顶点数组的位置。还有一个指针指向当前的VAO、VBO、IBO、texture、framebuffer等

当您使用 glBindXYZ 函数之一时,您将一个句柄传递给 OpenGL。然后它从内存 table 中查找指向 bufffer/vertex array/texture/etc 的指针,并将相关指针设置为结果。

gen 函数是这样工作的,因为大多数人都知道他们需要多少个 vbos 或 vaos,这使得创建它们更容易。这只是一个问题,当你有可变数量的 vbos 时。

就内存布局而言,一次创建多个缓冲区并不比一个接一个地创建缓冲区有优势。两者

glCreateBuffers(1, &handle1);
// Stuff
glCreateBuffers(1, &handle2);
// Stuff
glCreateBuffers(1, &handle3);
// Stuff

glCreateBuffers(3, &handles);
// Stuff x 3

结果相同。在这两种情况下,vbo 都尽可能靠近(如果它们已经用完了下一个 vbo 应该去的内存块,那么它会离其他的更远一些。