我的系统由几个代表四边形的对象组成。每个四边形都由相同的顶点表示,因此,每个对象仅存储表示对象在世界中的变换及其自己的对象空间的矩阵。在每次渲染过程中,在这些矩阵用它们的帧变换更新后,它们与当前的视图和投影矩阵相乘以形成该对象的 MVP 矩阵。然后将对象顶点与 MVP 矩阵一起发送到着色器,在着色器中顶点乘以 MVP 矩阵。这里的低效率是每个四边形是单独绘制的,这意味着每个四边形都有一个单独的调用 glDrawElements。在任何给定时刻,可能存在 50 或 60 个四边形,有些超出范围并被破坏,或者它们的动画可能完成,所以它们 re也被摧毁,但更多会随机进入存在。将所有必要的值存储在 VBO 中并在每次传递期间仅调用一次 glDrawElements 会显着提高性能吗?
问问题
1083 次
2 回答
1
将所有必要的值存储在 VBO 中并在每次传递期间仅调用一次 glDrawElements 会显着提高性能吗?
是的,它会快得多。正如您正确识别的那样,第一个原因将是一个单一的glDrawElements
呼叫。其次是 VBO 将数据保存在 GPU 本身中。
如果四边形超出范围,您可以将它们的内存重新用于新的四边形。VBO 可用于绘制缓冲区的子区域,因此您可以获得很大的灵活性而无需内存分配。
通过使用 VBO,您可以最大限度地减少与 GPU 的交互,从而获得性能优势。
于 2013-04-17T07:18:39.847 回答
1
让我们首先用一些简单的数学来解释它:
- 目前,您不需要将任何顶点数据推送到 GPU(每帧),但每个四边形有 12-16 个浮点矩阵数据,并在 CPU 上对每个四边形执行矩阵矩阵乘法。
- 将所有内容放入一个 VBO 时,您必须为每个四边形传输 4 个顶点(~12 个浮点数),但没有矩阵数据(当然,全局 VP 除外)并且您必须进行 4 个矩阵向量乘法(~1 个矩阵矩阵乘法)在 CPU 上。
因此,传输的工作量和数据量并没有太大变化。但变化是,传输的数据从许多小的统一更新转移到单个大 VBO 更新,这很可能更快(两者都是因为从硬件方面来看缓冲区更新可能比多个统一更新更快,但不要把我钉在这个问题上,其次是因为大大减少了驱动程序开销)。最重要的是,通过使用单个大型绘制调用而不是许多更小的绘制调用,可以进一步减少开销。
所以是的,它肯定值得一试,尽管它是否真的是您特定应用程序中的“显着”改进必须进行评估。
于 2013-04-17T08:37:01.013 回答