最好提前为静态数据创建大量静态VBO,还是将数据流式传输到VBO中



我需要渲染非常密集的网格。顶点数据是完全静态的。显然,大型VBO对性能不太好(来源:http://www.opengl.org/wiki/Vertex_Specification_Best_Practices#Size_of_a_VBO.2FIBO,尽管不幸的是,它未能链接到自己的源。)即使大缓冲区对性能来说是可以的,我的顶点数据的总大小有时也会超过我使用glBufferData()可以成功分配的大小。

因此,假设我需要将网格分解为较小的VBO,每个VBO只有几MB,建议使用以下哪种方法:

1) 在启动时分配足够的缓冲区来保存所有网格数据。然后,渲染就像一次绑定一个缓冲区并调用glDrawArrays()一样简单。

2) 在启动时分配一个小的固定缓冲池。渲染需要用三角形块填充缓冲区,调用glDrawArrays(),用下一个块填充另一个缓冲区,再次调用glDraw阿拉斯(),依此类推。因此,可能需要更多的CPU工作。

3) 其他一些我没有想到的方法。

我的部分问题归结为VBO的内存分配是如何工作的——如果我在启动时分配足够小的缓冲区来容纳所有网格数据,我会遇到同样的内存限制吗?这会阻止我分配足够大的单个缓冲区来存放所有数据吗?或者VBO是否与虚拟内存集成,以便OpenGL在我超过可用图形内存时处理VBO的交换?

最后,其中有多少实际上取决于实现?AMD/Intel/NVidia是否提供了有用的参考资料来解释缓冲区管理的最佳实践?

我建议您继续分配尽可能少的静态缓冲区,每个缓冲区都有尽可能多的顶点。如果性能开始下降,则需要降低模型的质量级别(即顶点数量)。

实际上,使用过多的SMALL缓冲区对性能不利,因为每次渲染都涉及一定量的固定开销。单个缓冲区中的顶点越多(在合理范围内),需要进行初始设置的次数就越少。

大型(如非常大型)VBO可能不好的原因是视频卡的性能功率/内存容量有限,在系统RAM和视频RAM之间来回交换大量内存可能会很密集。。。并不是因为另一种机制更适合渲染非常大的模型。我无法想象你为什么在glBufferData()上失败,除非你的需求非常巨大(远远大于256 MB),或者你可能使用USHORT数据类型作为索引,但分配了超过65000个。

1MB-4MB的建议与你应该如何优化你的模型有关,并且在一定程度上取决于你正在使用的视频卡的生成。大多数视频卡支持巨大的VBO。我打赌你的问题在别处。

最新更新