gpt4 book ai didi

performance - 什么时候VBO比 “simple” OpenGL原语(glBegin())快?

转载 作者:行者123 更新时间:2023-12-03 07:50:53 25 4
gpt4 key购买 nike

经过多年关于“顶点缓冲对象”(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 ram,256 MB Quadro NVS 110)上,性能都是无法区分的。但是,它的确按预期的比例扩展了点数。显然,我也禁用了vsync。

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

glBegin()/ glEnd():

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

  • 顶点阵列(CPU端):
  • 1K点-> 603 FPS
  • 10K点-> 402 FPS
  • 100K点-> 97 FPS
  • 1M pts-> 14 FPS

  • 顶点缓冲区对象(GPU端):
  • 1K点-> 604 FPS
  • 10K点-> 399 FPS
  • 100K点-> 95 FPS
  • 1M pts-> 14 FPS

  • 我使用GL_TRIANGLE_STRIP渲染了相同的数据,并且变得难以区分(尽管由于额外的光栅化而比预期的慢)。如果有人需要,我也可以张贴这些数字。


    问题
  • 有什么用?
  • 我该怎么做才能实现VBO的预期性能提升?
  • 我想念什么?
  • 最佳答案

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

  • CPU(创建顶点,APU调用以及其他所有功能)
  • 总线(CPU <-> GPU传输)
  • 顶点(固定功能管线执行之上的顶点着色器)
  • 像素(填充,片段着色器执行和裁剪)

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

    关于performance - 什么时候VBO比 “simple” OpenGL原语(glBegin())快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/430555/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com