代码之家  ›  专栏  ›  技术社区  ›  Drew Hall

VBOs什么时候比“简单”的OpenGL原语(glBegin())快?

  •  36
  • Drew Hall  · 技术社区  · 15 年前

    听了很多年关于顶点缓冲区对象(Vertex Buffer Objects,vbo)的知识后,我终于决定用它们来做实验(显然,我的东西通常不是性能关键的……)

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

    实验细节

    在实验中,我生成了一个由大量点组成的(静态)三维高斯云。每个点都有与其关联的顶点和颜色信息。然后我在连续的几帧中围绕着云层旋转相机,以一种“环绕”的方式。同样,这些点是静态的,只有眼睛移动(通过gluLookAt())。数据在任何渲染之前生成一次,并存储在两个数组中,以便在渲染循环中使用。

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

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

    绩效结果##

    如上所述,在我的台式机(xpx64,8gbram,512mbquadro1700)和笔记本电脑(XP32,4gbram,256mbquadronvs110)上,性能是无法区分的。不过,它确实按预期的点数进行了缩放。显然,我还禁用了vsync。

    笔记本电脑运行的具体结果(渲染w/GL\u点):

    glBegin()/glEnd():

    • 10K点-->401帧/秒
    • 10万分-->97帧/秒
    • 1M分-->每秒14帧

    顶点阵列(CPU端):

    • 1K点-->603帧/秒
    • 10K点-->402帧/秒
    • 1M分-->每秒14帧

    • 1K点-->604帧/秒
    • 10K点-->399帧/秒
    • 10万分-->95帧/秒

    我用GL\u TRIANGLE\u STRIP渲染了相同的数据,得到了类似的不可区分性(尽管由于额外的光栅化,速度比预期的慢)。如果有人要的话,我也可以发这些号码。 .

    问题

    • 有什么好处?
    • 我错过了什么?
    6 回复  |  直到 15 年前
        1
  •  28
  •   Colonel Thirty Two    10 年前

    优化三维渲染有很多因素。

    • CPU(创建顶点、APU调用等)
    • 总线(CPU<->GPU传输)
    • 顶点(固定函数管道执行上的顶点着色器)

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

        2
  •  10
  •   Lol4t0    11 年前

    可能缺少一些东西:

    1. 这是一个疯狂的猜测,但你的 卡可能根本就缺少这种操作(即模拟它)。

    2. 您是否正在将数据复制到GPU的内存(通过 glBufferData ( GL_ARRAY_BUFFER GL_STATIC_DRAW GL_DYNAMIC_DRAW param)或者您正在内存中使用指向主(非GPU)数组的指针?(这需要每帧复制一次,因此性能很慢)

    3. 你路过吗 指数 作为另一个缓冲区通过 glBufferData数据 GL_ELEMENT_ARRAY_BUFFER 参数?

    如果这三件事都完成了,性能的提升是很大的。 C++的速度快5倍,但数组50K-10M顶点。

     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的帧速率是缓慢的。

        3
  •  2
  •   Will Mc    15 年前

    在阅读红皮书时,我记得有一段话说,VBO可能更快 . 一些硬件优化了这些,而另一些则没有。有可能你的硬件没有。

        4
  •  1
  •   Bahbar    14 年前

    我敢打赌这个测试并不能衡量你认为它衡量的东西。

        5
  •  -3
  •   steve9164    11 年前

    假设我记得这个权利,我的OpenGL老师,谁是众所周知的OpenGL社区,说他们是更快的静态几何,这将是渲染很多时间的一个典型的游戏,这将是桌椅和小静态实体。