OpenGL(ES 2.0)在共享内存架构中的VBO性能

10

我是一名桌面GL开发人员,现在开始探索移动领域。

为了避免误解或者单纯的回复,我谨慎地说我对GL和GL | ES机制非常清楚。

简短的问题是:如果我们在共享内存架构中使用GL | ES 2.0,使用VBO相对于客户端数组有什么意义?

更详细地说:

  • 顶点缓冲区是原始内存块,驱动程序无法以任何方式优化它,因为访问模式取决于:1)应用程序如何配置顶点数据布局,2)顶点着色器如何使用缓冲区内容,3)我们可以有很多操作方式不同的顶点着色器,并且以不同的方式引用相同的缓冲区。

  • 对齐:单个VBO存储可以从最佳的底层GL系统地址开始; 如果我只是强制(例如,遵守最佳实践的对齐)客户端数组分配到这些边界上怎么办?

  • 瓦片渲染与立即模式架构不应该起作用:据我理解,这与我的问题(即内存访问)无关。

我知道使用VBO可以让你的代码在未来的平台/硬件上运行得更好/更快,而不需要修改它,但这不是本问题的重点。

另外,我也意识到,在共享内存架构中使用VBO会使内存使用量加倍(如果您出于某种原因需要保留顶点数据),并且它会花费您将数据复制到VBO中的时间。

与交错的顶点数组一样,VBO的使用在开发人员论坛/博客/官方技术说明中被大肆宣传,而没有任何支持这些说法的数据(即基准测试)。

  • VBO在共享内存架构中值得使用吗?
  • 客户端数组工作良好吗?
  • 您对此有何看法/了解?
3个回答

3

我可以报告,在安卓设备上使用VBOs存储顶点数据并没有带来性能的提升。我在Adreno、Mali400和PowerVR GPU上尝试了它。然而,我们仍然使用VBOs,因为这是OpenGL ES的最佳实践。

您可以在我们的文章(顶点缓冲区对象段落)中找到关于此的注释。文章链接


非常感谢您分享这些结果。从性能角度来看,这才是最重要的。无论如何,我无法解释在共享内存GPU中如何可以如此倡导VBO使用,我想这只是为了营销或者“准备”相对新手的GL好习惯(没有告诉他们,现在也许最好不要使用它们,因为如果您仍然需要它们CPU端,可能会导致内存翻倍,并且因为不可避免的复制操作)。 - spattija

0

-1

我会告诉你我对iOS平台的了解。

  1. 如果你有静态几何体,VBO确实可以提高性能——一旦复制,每次绘制调用都不需要额外开销。CA会在每个绘制调用时从客户端内存复制数据到“GPU内存”。如果你忘记了,它可能会进行数据重新对齐。
  2. VBO可以通过glMapBuffer映射到GPU上——这是一个异步操作,意味着它几乎没有开销,但你应该记住——当你映射/取消映射缓冲区时,最好在取消映射操作后使用2帧——以避免同步问题。
  3. 苹果工程师声称,在SGX硬件上,即使你每帧重新上传,VBO的性能也比CA好——我不知道具体细节。
  4. VBO是最佳实践。CA已经被弃用。最好跟上现代趋势,尽可能保持跨平台性。

当然,使用VBO的标准原因正如你所说,但不幸的是,在这个问题中大多数原因已经被排除了。 - Christian Rau
关于缓冲区映射的内容并没有提到 - 这是在 CPU 和 GPU 之间发送几何图形的最快方式,但也有一定的限制。 - StiX
缓冲区映射在我的问题背景下不应该起作用,它的目标是更新缓冲区内容,而我询问的是在向GL顶点拉取器(DX术语中的输入装配器)提供数据的情况下拥有共享内存和无专用内存的GPU的性能优势。 - spattija

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接