调整几何吞吐量的OpenGL性能

时间:2010-07-13 10:20:58

标签: opengl performance

这可能已经被一遍又一遍地问过,但是我找不到任何有用的东西,所以在这里又一次......

在我的应用程序中,我需要渲染一个相当大的网格(几百万个三角形或更多),并且我遇到了一些问题,从中获得了不错的帧速率。 CPU几乎是空闲的,所以我绝对是GPU限制的。更改分辨率不会影响性能,因此不会出现碎片或光栅限制。

网格是动态的(但本地是静态的)所以我无法将整个内容存储在视频卡中并通过一次调用来呈现它。由于应用程序的特定原因,数据存储为八叶树,叶片中有体素,这意味着我基本上可以免费获得视锥体剔除。顶点数据由坐标,法线和颜色组成 - 不使用纹理或着色器。

我的第一种方法是使用一个大的STREAM_DRAW VBO从内存中渲染所有东西,结果证明太慢了。我最初的想法是,我可能会使总线过载(每帧推动约150 MiB),所以我实现了一个缓存方案,该方案存储最近用于在显卡上的静态VBO中渲染对象的几何体,每个VBO存储几个100 KiB到几个MiB值的数据(每个VBO存储更多会产生更多的缓存抖动,所以这里有一个权衡)。下图是数据的示例,其中红色的所有内容都是从缓存的VBO中提取的。

Example of the rendered data http://gimaker.users.sourceforge.net/0010.png

如下面的数字所示,使用缓存时,我看不到性能的惊人提升。对于大约1百万个三角形的完全静态网格,我得到以下帧速率:

  • 不缓存:1.95 Hz
  • 使用顶点数组进行缓存:2.0 Hz(> 75%的网格缓存)
  • 使用STATIC_DRAW维也纳协会进行缓存:2.4 Hz

所以我的问题是如何加快速度?即:

  • 建议的顶点格式是什么才能获得不错的性能?我使用位置和法线的交叉存储作为GL_FLOATGL_UNSIGNED_BYTE用于颜色,一个填充字节用于获得4字节对齐(28字节/顶点总数)。
  • 对我所有的盒子使用相同的缓冲区是否正常可能会有所帮助(所有盒子都是轴对齐的,所以我可以分配一个普通缓冲区,它是最大缓存条目的大小,并将它们全部用于它们。)
  • 我如何知道管道的哪个部分是瓶颈?我没有一个壮观的视频卡(英特尔GM965与开源Linux驱动程序),所以我可能达到极限。我可以从典型的硬件(2-3岁的集成显卡,现代集成显卡,现代独立显卡)中获得多少吞吐量?
  • 关于如何解决这个问题的任何其他提示,陷阱等。

我对建议LOD(我已经测试过这个),特定于供应商的提示或使用1.5以上的OpenGL功能的答案不感兴趣。

3 个答案:

答案 0 :(得分:5)

你可能不会喜欢这种回应......

我发现了你的问题:采用开源Linux驱动程序的英特尔GM965

虽然我目前的工作没有达到您的数据量,但我们已经在VBO中渲染了数百万个顶点,并且英特尔图形硬件/驱动程序已被证明是无用的。给自己一张NVidia卡(并且不得不使用二进制驱动程序,它只是有效),你就可以了。即使是高端Quadro(如果工作正在付费)或高端GTX 400系列(如果你付钱或者只是想在工作中节省一些钱),甚至不必是当代的,应该做得很好w /最新驱动程序。如果无法升级您的机器,您也可以尝试找到具有此硬件的机器进行测试。

答案 1 :(得分:0)

我会首先使用性能分析器(如gDEBugger),这样你就可以判断出你是顶点,片段还是总线限制等等。很难猜出在这种特殊情况下要执行哪些优化(英特尔+开源驱动程序)。

您是否也尝试过VA模式?你在使用glDrawElements吗? glDrawArrays?数据顶点缓存是否友好(变换前后变换)?

答案 2 :(得分:0)

我不知道你的“网格”,但似乎它们都是立方体。如果可以,请将单个联合立方体渲染到显示列表并呈现该显示列表的缩放版本。这通常会提高10倍的速度,因为没有使用顶点数据或视频内存耗尽而无法使用总线。

当然,这取决于您更改数据的能力。如果它真的不像图片那么可能不是这样的。