OpenGL具有可以同时创建多个对象的功能
glCreateBuffers(1,&handle);
...
glDeleteBuffers(1,&handle);
我想这样做的目的是为了节省同时创建/销毁所有对象的时间。但这只是在初始化时,还是会影响内存布局,例如增加局部性,从而缩短渲染时间。
在这个问题被标记为重复之前,在OpenGL中同时生成多个索引(名称)有好处吗?,这个问题是关于用ARB_direct_state_access
创建对象,而不是RetoKoradi评论的名称创建,这很便宜。
VRAM不是磁盘,它是R和aAccessM内存。OpenGL不需要扫描它就可以到达上面的东西。通常在某个地方存储一个内存表,它可以跟踪缓冲区和顶点阵列的位置。还有一个指针指向当前的VAO、VBO、IBO、纹理、帧缓冲区等。
当您使用其中一个glBindXYZ
函数时,您会将句柄传递给OpenGL。然后,它从内存表中查找指向缓冲区/顶点数组/纹理等的指针,并将相关指针设置为结果。
gen函数是这样工作的,因为大多数人都知道他们需要多少vbo或vao,这使得创建它们变得更容易。当你有可变数量的vbos时,这只是一个问题。
在内存布局方面,一次创建多个缓冲区比一个接一个地创建缓冲区没有优势。两个
glCreateBuffers(1, &handle1);
// Stuff
glCreateBuffers(1, &handle2);
// Stuff
glCreateBuffers(1, &handle3);
// Stuff
和
glCreateBuffers(3, &handles);
// Stuff x 3
结果是一样的。在这两种情况下,vbo都尽可能接近(如果它们已经用完了下一个vbo应该去的内存块,那么它将离其他的有点远。