openglvbos中死物的处理

openglvbos中死物的处理,opengl,vbo,Opengl,Vbo,想象一个典型的游戏,在这个游戏中,模拟世界中的对象被创建和销毁。创建这些对象时,其顶点数据存储在VBO中。此VBO每帧渲染一次 是否有处理死物的最佳实践?即,当对象被销毁,因此不再需要渲染时,其相应的VBO数据会发生什么情况 似乎您希望“释放”该内存以供其他对象将来使用。否则,VBO最终将几乎完全被死掉的数据填满 我有一个可能的想法来实现这一点:一个VBO内存映射,其中单个字节被标记为空闲或正在使用。(此映射将作为普通数组存在于CPU上,而不是GPU上。)创建对象时,我们将其数据缓冲到由映射确定

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

是否有处理死物的最佳实践?即,当对象被销毁,因此不再需要渲染时,其相应的VBO数据会发生什么情况

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

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

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

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

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

听起来您正在考虑使用池分配器。在这些方面已经做了很多工作,这些工作也应该很好地应用于VBO内部的分配

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

我提供的最简单的改进是从最后一个填充的插槽开始扫描空闲插槽,而不是总是从一开始就扫描

通过使用
deque
样式的数据结构来存储空闲位置列表,您可以以空间换取速度,这样就无需扫描空闲位置


VBO中存储的数据的大小实际上对管理器没有影响。只有可被非法重新利用的插槽数量。

是您的问题还是您根本不删除vbo?@Viktor:vbo创建成本相当高。如果你有大量短暂的对象(比如玩家发射的子弹),那么拥有一个长寿命的VBO(始终是“子弹列表”)并更新帧间的坐标是有效的方法,即使对象的数量可能不同。@Viktor:碎片,有点像。更准确地说,问题在于死物的顶点数据堆积。只有一个VBO,因此我无法删除它。为了提高性能,将所有对象放在一个VBO中是有意义的。为每个192字节的对象使用单独的VBO是次优的。“我的场景由几百个对象组成。每个对象大约有八个顶点。”所以。。。然后是地雷船。实际上是包围盒的精灵:)是的!关于碎片的观点很好。幸运的是,我的物品几乎都一样大。