为啥分配大量 VBO 会导致性能问题?

Posted

技术标签:

【中文标题】为啥分配大量 VBO 会导致性能问题?【英文标题】:Why does allocating a large number of VBOs cause performance issues?为什么分配大量 VBO 会导致性能问题? 【发布时间】:2014-03-27 21:18:15 【问题描述】:

我有一个分配约 300 个 VBO 的应用程序。但是,每帧只有 40 个用于绘制命令。我已经使用 OpenGL 分析器验证了这一点。

我注意到,如果我减少 VBO 的数量,性能会大大提高。然而,鉴于大多数 VBO 大部分时间都没有使用,我很惊讶这是一个问题。我假设大多数 VBO 没有分配内存,因为我什至没有在未使用的 VBO 上调用 glBufferData。

有谁知道为什么有多余的未使用的 VBO 会导致性能下降?我猜这可能取决于驱动程序(我有一个 Nvidia 460GTX)。

另外,我对将一堆粒子系统(其中大部分在任何给定帧期间未使用)组合成单个 VBO 的方法感兴趣,这样我就不会遇到这个问题。

编辑:事实证明,性能问题与 VBO 无关。但是,在调查过程中,我学到了很多关于将数据流式传输到 VBO 的知识。这篇文章很有意思:http://onrendering.blogspot.com/2011/10/buffer-object-streaming-in-opengl.html

【问题讨论】:

司机可能还在为他们保留一些东西。 @Jesus 是的,我很确定这是驱动程序问题。无论如何使用 300 个 VBO 是愚蠢的,所以我会考虑另一种方案。 如果您每次绘制调用仅使用大约 40 个 VBO,您可能只是重用一些 VBO。 我正在考虑使用一个大 VBO 作为循环缓冲区。有点复杂,但我不明白为什么那行不通。 这很奇怪,我有大约 4000 个用于移动 OpenGL ES 的 VBO,而且效果很好。你能分享你的代码或做一些我会尝试调查的例子吗? 【参考方案1】:

事实证明,在我的案例中,VBO 的数量并不是性能瓶颈的原因。事实上,似乎大多数 OpenGL 实现都能很好地处理大量 VBO。我在 2009 MacBook Air 和 Nvidia GTX 460 上进行了测试。

切线相关:如果您使用许多 VBO,通常有一种方法可以避免这种情况并提高效率。在我的例子中,我使用单个流式 VBO 来渲染来自多个不同粒子系统的粒子,而不是为每个粒子系统分配一个 VBO。这减少了批处理/绘图调用的数量,并释放了一些 CPU 周期。

以下是有关 VBO 流式传输的更多信息: http://onrendering.blogspot.com/2011/10/buffer-object-streaming-in-opengl.html

【讨论】:

以上是关于为啥分配大量 VBO 会导致性能问题?的主要内容,如果未能解决你的问题,请参考以下文章

VBO 与即时模式性能

为啥用 innerText 替换 InnerHTML 会导致性能下降 15 倍以上

为啥手动实现哈希标签可以提高查询的性能?

为啥 Global.asax.cs 中的 Session_Start 会导致性能问题?

为啥以不同的顺序运行我的测试会导致性能截然不同? [复制]

OpenGL - 尝试使用 VBO 会导致错误