注:Google 在自己文章中用了 Display Performance 来描述我们常说的流畅度,为了显得有文化,本文主要用“显示性能”一词来代指“流畅度”(虽然两者在概念上有细微差别)。
从 Android 诞生的那一刻起,流畅度就为众人所关注。一时之间,似乎所有人都在讨论 Android 和 iOS 谁的流畅度更好。但是,毫不夸张的说,流畅度绝对是 Android 众多性能维度中最为奇葩的一个。因为,为了刻画这一性能维度,业界设计了各式各样的指标来对其进行衡量。可以说弄清了这些指标我们就明白了什么是流畅度,可是这似乎并不太容易。
笔者简单搜集了一些业界中提及的显示性能指标,大家可以来品评一下:
指标名称:FPS
相关资料:Android性能测试之fps获取指标名称:Aggregate frame stats(N 多个指标)
相关资料:Testing Display Performance指标名称:Jankiness count、Max accumulated frames、Frame rate
相关资料:JankTestBase.java指标名称:SM、Skipped frames
相关资料:Android应用性能评测调优
面对如此之多的显示性能指标,想必大家也会跟笔者一样,心中难免疑惑丛生。其实,我们只需要依次弄清楚以下三个哲学问题,所有的问题也许就会迎刃而解:
- 你是谁——这些指标具体反映了什么问题
- 你从哪儿来——这些指标数值是怎么得到的
- 你要到哪儿去——这些指标如何落地来指导优化
因此,本文将尝试依次从上诉三个问题来逐步分析和探讨各个显示性能指标。
Step 1:你是谁——这些指标具体反映了什么问题
总所周知,脱离了具体的应用背景,所有的指标都是没有意义的。所以,为了彻底弄清楚各个显示性能指标的具体身份,我们势必得从 Android 的图像渲染流程说起。
具体展开之前,首先需要说明的是,为了降低复杂程度和本章篇幅,在这个环节之中,我们只讨论图像渲染流程中的各个具体环节所对应的指标有哪些。而指标的具体定义,由第二章《你从哪儿来——这些指标数值是怎么得到的》进行讨论。
Android 图像渲染流程
下图是笔者结合各类资料(主要是是源码及官方文档),在根据自己的理解梳理出的几种常见场景下的图像渲染流程:
PS 1:笔者个人技术水平有限,若存在理解有误的地方还望指正。
PS 2:本文主要讨论的 Android 源码为 Android 6.0
备注:基于 OpenGL 的应用可以使用 Choreographer 中的 VSYNC 信号来进行图像渲染工作的安排。
上面这幅图涉及的概念较多,要完全吃透估计得费不少时间。不过好在我们只是想弄明白显示性能各种指标的含义,所以我们只需要理清下面两大关系即可:
SurfaceFlinger、HWComposer与Surface的关系
- Surface:可以理解为Android系统中的一个基本显示单元。只要使用Android任意一种API绘图,绘制的结果都将反映在Surface上。
- SurfaceFlinger:服务运行在System进程中,用来统一管理系统的帧缓冲区设备,其主要作用是将系统中的大部分Surface进行合成。SurfaceFlinger主要使用GPU进行Surface的合成,合成的结果将形成一个FrameBuffer。
- HWComposer:即Hardware Composer HAL,其作用是将SurfaceFlinger通过GPU合成的结果与其他Surface一起最终形成BufferQueue中的一个Buffer。此外,HWComposer可以协助SurfaceFlinger进行Surface的合成,但是否进行协助是由HWComposer决定的。
- 值得注意的是,有的Surface不由WindowManager管理,将直接作为HWComposer的输入之一与SurfaceFlinger的输出做最后的合成。
Choreographer、SurfaceFlinger、HWComposer与VSYNC的关系
- VSYNC:Vertical Synchronization的缩写,它的作用是使GPU的渲染频率与显示器的刷新频率(一般为固定值)同步从而避免出现画面撕裂的现象。
- HWComposer:VSYNC信号主要由HWComposer通过硬件触发。
- Choreographer:当收到VSYNC信号时,Choreographer将按优先级高低依次去调用使用者通过postCallback提前设置的回调函数,它们分别是:优先级最高的CALLBACK_INPUT、优先级次高的CALLBACK_ANIMATION以及优先级最低的CALLBACK_TRAVERSAL。
- SurfaceFlinger:Surface的合成操作也时基于VSYNC信号进行的。
简单来说,Android 图像渲染流程主要由以下特征:
- 我们可以简单把 Android 图像渲染架构分为应用(Surface)、系统(SurfaceFlinger)、硬件(Screen)三个层级,其中绘制在应用层,合成及提交上屏在系统层,显示在硬件层;
- 无论应用(Surface)、系统(SurfaceFlinger)、硬件(Screen)都是当且仅当绘制内容发生改变,才会对绘制内容进行处理;
- 系统中的 SurfaceFlinger 以及绝大部分 Surface 都是按照 VSYNC 信号的节奏来安排自己的任务;
- 目前,绝大部分 Surface 都属于 Hardware Rendering。
各个指标在 Android 图像渲染流程所代表的意义
大致梳理了 Android 的图像渲染流程之后,我们需要做的一件事情,就是看看上面提到的指标,都对应了渲染流程的哪些阶段,这样对于我们了解各个指标所反映的具体物理意义及其优势劣势都有极大帮助。再次强调,在这个环节之中,我们的讨论仅限于只讨论指标所对应的渲染流程的具体阶段,各指标的具体定义由第二章具体展开。
系统层级(SurfaceFlinger)的显示性能指标
- 基础数据:SurfaceFlinger 合成次数
- 指标意义:
- 系统合成帧率:FPS
- 特别说明:
- SurfaceFlinger 仅在显示区域内的 Surface 有提交内容更新时才会进行合成(上屏),因此,系统合成帧率低并不一定意味着图像显示性能差,有可能是因为当前并没有任何的内容更新所导致。
- 若显示区域内的某个待测 Surface 持续进行更新时, SurfaceFlinger的合成(上屏)的频率可以在某种程度上反映该 Surface 的显示性能,但从理论上分析该指标并不一定准确。这是因为,若显示区域内尚存在其他 Surface,它们也会影响 SurfaceFlinger 的合成(上屏)的行为,从而干扰结果。
- 若某个 Surface 的合成不在 SurfaceFlinger 中进行(如 Camera Preview),则该 Surface 的显示性能无法用这类指标进行衡量。
应用层级(Surface)的显示性能指标
- 基础数据:绘制过程中每一帧的关键时间点(如开始绘制时间、结束绘制时间等)
- 指标意义:
- 应用绘制帧率:Frame rate
- 应用绘制轮询频率:SM
- 应用绘制超时(跳帧)的次数:Aggregate frame stats、Jankiness count、Skipped frames
- 应用绘制超时(跳帧)的幅度:Aggregate frame stats、Max accumulated frames、Skipped frames
- 特别说明:
- 与 SurfaceFlinger 类似, Surface也仅在有内容更新时才会进行绘制,因此,绘制频率低并不一定意味着图像