在systrace工具中,当我看到surfaceflinger执行绘图命令和窗口组合时,它在CPU上运行,而不是在GPU上运行,这真的很奇怪。但根据Romain Guy的谷歌谈话,他们告诉我们,绘图命令的组成和执行是在GPU上执行的。我的设备有GPU,即使那时他们也在使用CPU核心。我认为如果CPU核心是免费的,那么它使用CPU核心,否则它使用GPU。
有三种方法可以进行表面合成:
- 使用"覆盖"平面。当像素被发送到显示器时,最新的设备将组成多达四个平面。这(通常)是进行表面合成的最有效的方法。它是DRM视频所必需的,因为GLES目前没有办法组成"安全"的表面
- 在GPU上,使用OpenGL ES.SurfaceFlinger,如果你有四个以上的平面要组成,就会回到这个状态。它还用于虚拟显示器和类似
screenrecord
的东西。在某些设备上,如果一点也没有更新任何曲面,硬件编写器将使用GPU编写曲面,然后只显示单个缓冲区。如果没有任何变化,这比覆盖平面的带宽效率更高(因为你不必在所有表面上运行,这意味着你需要更少的内存带宽,这意味着您可以降低时钟频率,也意味着您可以使用更少的功率) - 在CPU上。没有人再这样做了
它的具体功能因设备而异,并且随着时间的推移而不断发展。如果你想看看它到底在做什么,试试adb shell dumpsys SurfaceFlinger
。硬件编辑器的细节(接近底部)是最有趣的部分。运行命令时,您可能需要主动滚动设备显示屏上的某些内容,以避免GLES优化。
我猜您看到的是系统中的prepare()
和set()
调用和缓冲区管理,而不是实际的像素组成。
更新:这篇文章写得很好。
更新2:现在在Android系统级图形文档中有一个完整系统的概述。