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

时间:2012-10-25 01:21:05

标签: memory mobile opengl-es gpu vbo

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

为了避免误解,或者欢迎但是微不足道的回复,我可以谦卑地说我非常了解GL和GL | ES机器。

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

更详细:

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

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

  • 基于平铺的渲染与立即模式架构不应该发挥作用:根据我的理解,这与我的问题(即内存访问)无关。

据我所知,使用VBO可以让代码在 future 平台/硬件中更好/更快地运行而无需修改它,但这不是这个问题的重点。

除此之外,我还意识到在共享内存架构中使用VBO会使内存使用量增加一倍(如果由于某种原因,您必须保留顶点数据),并且需要花费大量数据。

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

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