4

很奇怪,在 systrace 工具中,当我看到 Surfaceflinger 执行绘图命令和窗口合成时,这是在 CPU 上运行而不是在 GPU 上运行。但根据 Romain Guy 的谷歌谈话,他们告诉我们绘图命令的这种组合和执行是在 GPU 上执行的。我的设备有 GPU,即使他们使用的是 CPU 内核。我认为如果 CPU 内核是免费的,那么它使用 CPU 内核,否则它使用 GPU。

4

1 回答 1

9

表面合成的三种方法:

  1. 使用“覆盖”平面。当像素被发送到显示器时,最新的设备将组成多达四个平面。这(通常)是进行表面合成的最有效方法。它是 DRM 视频所必需的,因为 GLES 目前无法组成“安全”表面。
  2. 在 GPU 上,使用 OpenGL ES。如果您有四个以上的平面要组合,SurfaceFlinger 将回退到此。它也用于虚拟显示器和类似的东西screenrecord。在某些设备上,如果没有更新任何表面,硬件合成器将使用 GPU 合成表面,然后仅显示单个缓冲区。如果没有任何变化,这比覆盖平面更节省带宽(因为您不必遍历所有表面,这意味着您需要更少的内存带宽,这意味着您可以降低时钟频率,这意味着您可以使用更少的功率)。
  3. 在 CPU 上。没有人再这样做了。

它的确切作用因设备而异,并且随着时间的推移而发展。如果您想确切了解它在做什么,请尝试adb shell dumpsys SurfaceFlinger. 硬件作曲家细节(靠近底部)是最有趣的部分。您可能需要在运行命令时主动滚动设备显示屏上的某些内容以避免 GLES 优化。

我猜您在 systrace 中看到的是prepare()andset()调用和缓冲区管理,而不是实际的像素组成。

更新:这篇文章中有一篇非常好的文章

更新 2:现在在Android System-Level Graphics文档中有完整系统的概述。

于 2013-12-31T01:24:28.710 回答