在多年听说顶点缓冲区对象 (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 承诺的性能提升?
- 我错过了什么?