使用OpenGL ES 2.0在Android中进行双缓冲页面翻转

时间:2014-08-03 17:49:39

标签: android opengl-es vsync surfaceflinger

我可以在多大程度上接触到Android设备'从Froyo开始安全地使用图形硬件?

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

它应该是这样的:

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

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

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

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

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

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

  7. 重复步骤1 - 6。

    每秒更新显示屏大约15 - 25次,最适合我的需求。 (我永远不需要60 fps或任何高于30 fps的东西。)

    我计划仅使用OpenGL ES 2.0进行所有渲染。

1 个答案:

答案 0 :(得分:3)

你不需要这样做。如果你这样做,你的缓冲将是冗余的操作系统为你做的缓冲,并且只会增加延迟和开销。

您可以从this page了解当前的Android图形架构。较旧版本的Android有很大不同,但从一开始就在Android中出现了双缓冲或三缓冲的概念。它是OpenGL ES工作原理的重要组成部分。

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

根据this dashboard,Froyo及其早期约占市场的0.7%。针对姜饼和后来更典型。如果您的目标是API 16(第一个Jellybean版本),您现在会损失大约25%(13.5%姜饼,11.4%ICS),主要是由于硬件要求较低而配有姜饼的低端设备。