2014-09-27 69 views
1

如果我有一个模型,这是顶点不断变化,因此我需要重新绑定我的VBO每一帧上的所有信息会是更好的性能,使用即时模式?或者是所有的数据都被立即传递给GFX卡,这仍然是VBO的一个补偿因素?VBO VS立即模式性能

根据回答第一个问题,这是否意味着保持世界矩阵每个网格比简单地翻译的几何形状和重建的VBO更好?

回答

4

与几乎所有性能问题一样,答案是:这取决于。许多因素起作用,主要是您的确切使用模式以及OpenGL实现的特性。

虽然直接模式在很大程度上认为是过时的,和现代的OpenGL版本已被删除,它可以是相当困难与驻国际中心组织,以获得更好的性能,如果您的几何是高度动态的。

作为一个案例研究,我一直工作在一个业余项目(1)在相当长的时间(和很长的休息时间)。在这种情况下,所有顶点坐标都是动态计算的,并且只用于渲染一次。最初的版本是使用即时模式,因为这种情况很方便,而且立即模式在我编写时并没有过时。一旦我在几年后再次选择它,并将其移植到Core Profile和ES 3.0,我最初很难获得相同的性能。

您必须尝试各种选项才能找到最适合您的用例和平台的选项。常见选项包括:

  • 将您的顶点数据写入本地一块内存,并批量使用glBufferSubData()将其送入VBO。
  • 通过用NULL数据指针调用glBufferData()来创建一个足够大的VBO来保存数据。然后使用glMapBuffer()glMapBufferRange()映射缓冲区内存,并将顶点数据写入映射的内存。
  • 对于前面的方法,您可能还想尝试使用多个缓冲区,并在其中循环,以减少CPU与GPU之间的同步。

关于即时模式在当前GPU上的工作原理有一个常见的误解(部分反映在其他答案中)。没有当前的GPU(我知道)实际上支持即时模式。在进行即时模式调用时,驱动程序通常会将顶点数据放入缓冲区,稍后将这些缓冲区提交给GPU。所以GPU最终会执行几乎相同的绘图。唯一的区别是如果您构建缓冲区(通过使用基于VBO的绘图),或者如果您让驱动程序处理它(通过使用即时模式)。

即时模式绘制通常效率低下的主要原因是它需要这么多的API调用,而不是因为GPU最终执行的是什么。

(1)无耻插头,如果有人想看看它是什么:http://retokoradi.com/volume-rendering/

+0

[OpenGL维基上流缓冲对象有一个很好的文章](http://www.opengl.org/wiki/Buffer_Object_Streaming) – 2014-09-27 19:49:17

+0

感谢您的深入解答!特别是关于API调用的部分,我老实说认为效率低下是在即时模式下使用的方法。有用的信息! – Daniel 2014-09-27 21:15:53

1

是的,使用矩阵来转换几何图形几乎总是最好的。顶点着色器将每个顶点乘以一个世界矩阵。它全部都在多线程的GPU上,即使在复杂的几何图形上也具有良好的性能。

1

VBO的性能会更好,因为正如你所说,它将所有数据一次发送到GPU。如果您使用双缓冲解决方案,在准备下一帧的VBO时GPU运行速度通常会更快,而GPU正在从前一帧渲染该帧,因为它不会停止等待来自CPU的更多数据。

是的,这将是更好的选择存储在不同的世界矩阵的每个VBO如果您的转化可以通过这样一个矩阵来充分描述。您将每帧更改较少的数据,导致更少的数据必须通过总线传输到GPU。