【问题标题】:Double-Buffer Page-Flipping in Android using OpenGL ES 2.0使用 OpenGL ES 2.0 在 Android 中进行双缓冲页面翻转
【发布时间】:2014-08-03 17:49:38
【问题描述】:

从 Froyo 及更高版本开始,我可以安全地接近 Android 设备的图形硬件吗?

我想在 Android 设备上实现一个简单的页面翻转方案,使用两个帧缓冲区。

应该是这样的:

  1. 渲染到帧缓冲区 A。(帧缓冲区 A 是后台缓冲区,当前显示帧缓冲区 B。)

  2. 等待下一个 VSYNC(可能是 VSYNC 中断?)

  3. 告诉操作系统显示帧缓冲区 A 并将帧缓冲区 B 设置为后台缓冲区。

  4. 渲染到帧缓冲区 B。(帧缓冲区 B 是后台缓冲区,当前显示帧缓冲区 A。)

  5. 等待下一个 VSYNC(可能是 VSYNC 中断?)

  6. 告诉操作系统显示帧缓冲区 B 并将帧缓冲区 A 设置为后台缓冲区。

重复步骤 1 - 6。

每秒更新大约 15 到 25 次显示器最适合我的需要。 (我永远不需要 60 fps 或任何高于 30 fps 的速度。)

我打算只使用 OpenGL ES 2.0 进行所有渲染。

【问题讨论】:

  • 通常,GL 的双缓冲就是这样做的。所以你不需要在这里实现任何东西。
  • @derhass:我读到在 Jelly Beans 之前,Android 不能保证开始显示新准备显示的缓冲区。所以我的理解是对于通过冰淇淋三明治使用 Froyo 的设备,如果可能的话,我最好自己实现页面翻转。

标签: android opengl-es vsync surfaceflinger


【解决方案1】:

您不需要这样做。如果你这样做了,你的缓冲将与操作系统为你做的缓冲相比是多余的,只会增加延迟和开销。

您可以从this page 了解当前的 Android 图形架构。旧版本的 Android 有很大的不同,但从一开始就在 Android 中存在双缓冲或三缓冲的概念。这在很大程度上是 OpenGL ES 工作原理的一部分。

如果你想用 VSYNC 来调整你的应用程序的行为(而不是在队列填充时阻塞),那么应用程序方面的一个棘手的问题是弄清楚 VSYNC 何时到达。有关详细信息,请参阅文档的“游戏循环”部分,但要知道您可以使用 Choreographer 在 API 16+ 上获取 VSYNC 计时。

根据this dashboard,Froyo 及之前的市场份额约为 0.7%。以姜饼和更高版本为目标更为典型。如果您以 API 16(第一个 Jellybean 版本)为目标,您现在将损失大约 25%(13.5% 姜饼,11.4% ICS),主要是由于硬件要求较低而附带姜饼的低端设备。

【讨论】:

  • 感谢您的回答,法登先生。我刚刚投了“有用”的票。是的,我刚刚发现 Froyo 不再是 Android 市场的重要部分。我现在可以放弃 Froyo,这将使我可以选择使用 VBO,而无需使用 NDK。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多