一次分配多个对象与否

时间:2016-12-30 11:49:28

标签: opengl opengl-4

OpenGL具有可以一次创建多个对象的功能

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

我想这意味着它可以节省创建/销毁所有对象的时间。但这只是在初始化时,还是会影响内存布局,例如增加局部性,从而缩短渲染时间。

在此问题被标记为Is there an advantage to generating multiple indexes (names) at once in OpenGL?的重复之前,此问题是关于使用ARB_direct_state_access创建对象,而不是 name 创建,其中RetoKoradi评论很便宜。

1 个答案:

答案 0 :(得分:1)

VRAM不是磁盘,它是 R andom A ccess M emory。 OpenGL不需要扫描它就能到达它上面的东西。通常存储在某处的存储器表,它跟踪缓冲器和顶点阵列的位置。还有一个指向当前VAO,VBO,IBO,纹理,帧缓冲等的指针。

当您使用其中一个glBindXYZ函数时,会将句柄传递给OpenGL。然后它从内存表中查找指向bufffer / vertex数组/纹理/ etc的指针,并设置指向结果的相关指针。

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

在内存布局方面,一次创建多个缓冲区并不比在一个接一个地创建它们方面具有优势。两个

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

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

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