在OpenGL VBO中处理死对象

时间:2012-11-12 18:36:18

标签: opengl vbo

想象一下典型的游戏,模拟世界中的对象被创建和销毁。创建这些对象时,它们的顶点数据存储在VBO中。这个VBO每帧渲染一次。

处理死亡物体是否有最佳做法?即当对象被销毁并因此不再需要渲染时,相应的VBO数据会发生什么?

您似乎想要“释放”该内存以供其他对象使用。否则,您的VBO最终将完全填满死数据。

我有一个可能的想法来实现这个:VBO内存的映射,其中各个字节被标记为空闲或正在使用。 (此映射将作为普通数组存在于CPU上,而不是GPU上。)创建对象时,我们将其数据缓冲到由地图确定的空闲区域。我们将该区域标记为在地图上使用。然后当对象被破坏时,我们将该区域标记为free。我想如果你是懒惰的话,你会把地图存储为一个布尔数组,或者如果你想做的话,可以将它作为每个VBO字节的一个映射位打包。

到目前为止,这听起来像是最好的方法吗?是否有一种我没有看到的更常见的方法?

我知道很多这些问题取决于你渲染的场景的特征,所以这里是上下文。我的场景由几百个物体组成。每个对象有大约八个顶点。每个顶点都有一个存储为浮点数的位置和纹理坐标。所以,我们大致看一下:

4 bytes per float * 6 floats per vert * 8 verts per object * 500 objects
= 96,000 bytes of vertex data

1 个答案:

答案 0 :(得分:3)

听起来你正在考虑使用池分配器。有很多已经完成的工作,这些工作也应该适用于VBO中的分配。

如果所有元素的大小相同,那将非常简单。否则,您需要关注碎片,但堆管理器是众所周知的。

我提供的最简单的改进是从最后一个插槽开始扫描一个空闲插槽,而不是始终从头开始。

您可以使用deque样式的数据结构来存储空间以提高速度,从而无需扫描免费地点。

存储在VBO中的数据大小确实对管理器没有影响。只有可以重新调整用途的插槽数量。