36

在多年听说顶点缓冲区对象 (VBO) 之后,我终于决定尝试使用它们(我的东西通常不是性能关键,显然......)

我将在下面描述我的实验,但长话短说,我看到“简单”直接模式(glBegin()/glEnd())、顶点数组(CPU 端)和 VBO(GPU 端)之间的性能无法区分渲染模式。我试图理解为什么会这样,以及在什么条件下我可以期望看到 VBO 显着超过它们的原始(双关语)祖先。

实验详情

对于实验,我生成了一个包含大量点的(静态)3D 高斯云。每个点都有与之关联的顶点和颜色信息。然后我在连续的帧中围绕云旋转相机,形成一种“轨道”行为。同样,这些点是静态的,只有眼睛在移动(通过 gluLookAt())。数据在任何渲染之前生成一次并存储在两个数组中以用于渲染循环。

对于直接渲染,整个数据集在单个 glBegin()/glEnd() 块中渲染,循环包含对 glColor3fv() 和 glVertex3fv() 的单个调用。

对于顶点数组和 VBO 渲染,整个数据集通过一个 glDrawArrays() 调用来渲染。

然后,我只是在一个紧凑的循环中运行它一分钟左右,并使用高性能计时器测量平均 FPS。

性能结果##

如上所述,我的台式机(XP x64、8GB RAM、512 MB Quadro 1700)和笔记本电脑(XP32、4GB 内存、256 MB Quadro NVS 110)的性能无法区分。然而,它确实随着点数的增加而按预期缩放。显然,我也禁用了垂直同步。

笔记本电脑运行的具体结果(使用 GL_POINTS 渲染):

glBegin()/glEnd():

  • 1K 点 --> 603 FPS
  • 10K 点 --> 401 FPS
  • 100K 点 --> 97 FPS
  • 1M 点 --> 14 FPS

顶点数组(CPU 端):

  • 1K 点 --> 603 FPS
  • 10K 点 --> 402 FPS
  • 100K 点 --> 97 FPS
  • 1M 点 --> 14 FPS

顶点缓冲区对象(GPU 端):

  • 1K 点 --> 604 FPS
  • 10K 点 --> 399 FPS
  • 100K 点 --> 95 FPS
  • 1M 点 --> 14 FPS

我用 GL_TRIANGLE_STRIP 渲染了相同的数据并且得到了类似的无法区分(尽管由于额外的光栅化而比预期的要慢)。如果有人想要,我也可以发布这些数字。.

问题)

  • 是什么赋予了?
  • 我必须做什么才能实现 VBO 承诺的性能提升?
  • 我错过了什么?
4

5 回答 5

28

优化 3D 渲染有很多因素。通常有4个瓶颈:

  • CPU(创建顶点、APU 调用、其他一切)
  • 总线(CPU<->GPU 传输)
  • Vertex(固定函数管道执行上的顶点着色器)
  • 像素(填充、片段着色器执行和 rops)

您的测试给出了偏斜的结果,因为您在最大化顶点或像素吞吐量的同时拥有大量 CPU(和总线)。VBO 用于降低 CPU(更少的 api 调用,与 CPU DMA 传输并行)。由于您不受 CPU 限制,因此它们不会给您任何收益。这是优化 101。例如,在游戏中 CPU 变得很宝贵,因为它需要用于 AI 和物理等其他事物,而不仅仅是发出大量的 api 调用。很容易看出,将顶点数据(例如 3 个浮点数)直接写入内存指针比调用将 3 个浮点数写入内存的函数要快得多 - 至少可以节省调用的周期。

于 2009-01-10T05:46:40.217 回答
10

可能缺少一些东西:

  1. 这是一个疯狂的猜测,但您的笔记本电脑的卡可能根本没有这种操作(即模拟它)。

  2. 您是在将数据复制到 GPU 的内存(通过glBufferDataGL_ARRAY_BUFFER使用 anyGL_STATIC_DRAWGL_DYNAMIC_DRAWparam)还是在内存中使用指向主(非 GPU)数组的指针?(这需要每帧都复制它,因此性能很慢)

  3. 您是否将索引glBufferData作为通过和参数发送的另一个缓冲区传递GL_ELEMENT_ARRAY_BUFFER

如果这三件事都做好了,性能提升是很大的。对于 Python (v/pyOpenGl),它在大于 100 个元素的数组上快 1000 倍,C++ 快 5 倍,但在 50k-10m 个顶点的数组上。

这是我对 c++ (Core2Duo/8600GTS) 的测试结果:

 pts   vbo glb/e  ratio
 100  3900  3900   1.00
  1k  3800  3200   1.18
 10k  3600  2700   1.33
100k  1500   400   3.75
  1m   213    49   4.34
 10m    24     5   4.80

因此,即使使用 10m 顶点,它也是正常的帧速率,而使用 glB/e 它是缓慢的。

于 2009-02-14T15:14:46.953 回答
2

From reading the Red Book, I remember a passage that stated that VBOs are possibly faster depending on the hardware. Some hardware optimizes those, while others don't. It's possible that your hardware doesn't.

于 2009-01-13T19:21:41.753 回答
1

14Mpoints/s 并不是很多。很可疑 我们可以看到绘制的完整代码以及初始化吗?(将 14M/s 与 Slava Vishnyakov 获得的 240M/s (!) 进行比较)。更令人怀疑的是,它在 1K 绘制时降至 640K/s(与他的 3.8M/s 相比,无论如何,这看起来被 ~3800 SwapBuffers 所限制)。

我敢打赌,测试并不能衡量您认为它衡量的内容。

于 2009-11-19T21:10:05.670 回答
-3

Assuming I remember this right my OpenGL teacher, who is well known in the OpenGL community, said they are faster on static geometry which is going to be render a lot of time's on a typical game this will be tables chair and small static entities.

于 2009-01-13T19:24:39.877 回答