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

Posted

技术标签:

【中文标题】共享内存架构中的 OpenGL (ES 2.0) VBO 性能【英文标题】:OpenGL (ES 2.0) VBO Performances in a Shared Memory Architecture 【发布时间】:2012-10-15 03:32:13 【问题描述】:

我是一名桌面 GL 开发人员,我开始探索移动世界。

为避免误解或欢迎但不重要的回复,我可以谦虚地说我非常了解 GL 和 GL|ES 机制。

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

更详细:

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

对齐:单个 VBO 存储可以从最适合底层 GL 系统的地址开始;如果我只是强制(例如,尊重对齐最佳实践)将客户端数组分配到这些边界会怎样?

基于图块的渲染与即时模式架构不应发挥作用:据我了解,这与我的问题(即内存访问)无关。

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

此外,我还意识到在共享内存架构中使用 VBO 会使内存使用量翻倍(如果您出于某种原因必须保留顶点数据供您使用),并且会花费您数据的 memcpy。

与交错的顶点数组一样,VBO 的使用在开发者的论坛/博客/official_technotes 中得到了很大的“炒作”,但没有任何数据支持这些声明(即基准)。

在共享内存架构上使用 VBO 是否值得? 客户端阵列是否运行良好? 您对此有何看法/了解?

【问题讨论】:

【参考方案1】:

我可以报告说,使用 VBO 在 android 设备上存储顶点数据给我带来了零性能提升。在 Adreno、Mali400 和 PowerVR GPU 上进行了尝试。但是,考虑到这是 OpenGL ES 的最佳实践,我们使用 VBO。

您可以在我们的article(顶点缓冲区对象段落)中找到有关此内容的说明。

【讨论】:

非常感谢您分享这些结果。最后,从性能的角度来看,这很重要。无论如何,我无法解释自己如何在共享内存 GPU 中如此提倡 VBO 的使用,我想这只是为了营销或“准备”那些对 GL 相对较新的人了解良好实践(不告诉这一点,在目前,最好不要使用它们,因为如果您仍然需要 CPU 端它们可能会导致内存翻倍,并且因为不可避免的复制操作)。【参考方案2】:

根据这份报告,即使保持 SMA 不变,它也取决于 OpenGL 实现(一些 VBO 工作是在 CPU 上秘密完成的)和 VBO 的大小:

http://sarofax.wordpress.com/2011/07/10/vbo-vertex-buffer-object-limitations-on-ios-devices/

【讨论】:

【参考方案3】:

我会告诉你,我对 iOS 平台的了解。 VBO 确实可以提高你的表现。

    VBO 是完美的,如果你有一个静态几何图形 - 一旦复制,每次绘制调用都没有额外的开销。 CA 会在每次绘制调用时将您的数据从客户端内存复制到“gpu 内存”。如果您忘记了,它可能会重新调整数据。 VBO 可以通过 glMapBuffer 映射到 gpu - 这是一个异步操作,这意味着它几乎没有开销,但您应该记住 - 当您映射\取消映射缓冲区时,最好在取消映射操作后 2 帧使用它- 避免同步 Apple 工程师宣称,VBO 将比 SGX 硬件上的 CA 具有更好的性能,即使您每帧都重新上传它 - 我不知道细节。 VBO 是最佳实践。 CA 已弃用。更好地跟上现代趋势,并尽可能多地跨平台

【讨论】:

嗯,当然你的观点是使用 VBO 的标准原因,但不幸的是,大多数已经在问题中排除了。 没有关于缓冲区映射的内容 - 这是在 CPU 和 GPU 之间发送几何图形的最快方式,但有一定的限制 缓冲区映射不应该在我的问题中发挥作用,它的目标是更新缓冲区内容,而我询问的是在向 GL Vertex Puller(DX 术语中的 Input Assembler)提供数据。

以上是关于共享内存架构中的 OpenGL (ES 2.0) VBO 性能的主要内容,如果未能解决你的问题,请参考以下文章

OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)

OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)

OpenGL ES 2.0中的剪切平面

如何在Android上使用OpenGL ES 2.0绘制点

OpenGL ES 2.0 (iOS) 中的 2D 绘图

缩放、旋转、平移 w。 openGl ES 2.0 中的矩阵