android渲染使用CPU而不是GPU?

时间:2013-12-29 04:58:29

标签: android surfaceflinger

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

1 个答案:

答案 0 :(得分:9)

表面组合有三种方法:

  1. 使用“叠加”平面。当像素被发送到显示器时,最新的设备将组成多达四个平面。这(通常)是进行表面组合的最有效方式。它是DRM视频所必需的,因为GLES目前无法构成“安全”的表面。
  2. 在GPU上,使用OpenGL ES。如果你有超过四架飞机要组成,SurfaceFlinger将会回归到这个状态。它还用于虚拟显示和screenrecord之类的东西。在某些设备上,如果没有更新任何表面,硬件编写器将使用GPU组合曲面,然后只显示单个缓冲区。如果没有任何变化,这比覆盖平面更有带宽效率(因为您不必遍历所有表面,这意味着您需要更少的内存带宽,这意味着您可以降低时间,这意味着您可以使用更少的功率)。
  3. 在CPU上。没人这样做了。
  4. 它究竟在做什么因设备而异,并随着时间的推移而发展。如果您想确切了解它正在做什么,请尝试adb shell dumpsys SurfaceFlinger。硬件作曲家的细节(靠近底部)是最有趣的部分。在运行命令时,您可能需要在设备显示屏上主动滚动某些内容以避免GLES优化。

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

    更新:this post中有一个非常好的写作。

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