很奇怪的是,在 systrace 工具中,当我看到 SurfaceFlinger 执行绘图命令和窗口合成时,它是在 CPU 上运行的,而不是在 GPU 上运行的。但根据 Romain Guy 的 google 演讲,他们表示绘图命令的组合和执行是在 GPU 上执行的。我的设备有 GPU,即使它们使用的是 CPU 核心。我认为如果CPU核心是空闲的,那么它使用CPU核心,否则它使用GPU。
可以通过三种方法进行表面合成:
- 使用“覆盖”平面。当像素被发送到显示器时,大多数最新设备将组成多达四个平面。这(通常)是进行表面合成的最有效方法。它是 DRM 视频所必需的,因为目前 GLES 无法组成“安全”表面。
- 在 GPU 上,使用 OpenGL ES。如果要组合的平面超过四个,SurfaceFlinger 将回退到此。它还用于虚拟显示等
screenrecord
。在某些设备上,如果没有任何表面更新,硬件合成器将使用 GPU 合成表面,然后仅显示单个缓冲区。如果没有任何变化,这比覆盖平面的带宽效率更高(因为您不必遍历所有表面,这意味着您需要更少的内存带宽,这意味着您可以降低时钟频率,这意味着您可以使用更少的功率)。
- 在CPU上。没有人再这样做了。
它的具体功能因设备而异,并且随着时间的推移而不断发展。如果您想确切地了解它在做什么,请尝试adb shell dumpsys SurfaceFlinger
。硬件作曲家详细信息(靠近底部)是最有趣的部分。您可能需要在运行命令时主动滚动设备显示屏上的某些内容以避免 GLES 优化。
我猜你看到的是prepare()
and set()
systrace 中的调用和缓冲区管理,而不是实际的像素组成。
Update:有一篇非常好的文章这个帖子.
更新2:现在有完整系统的概述Android 系统级图形 doc.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)