流畅度分析

1.帧率

1.1 概念

  • 屏幕刷新率:每秒屏幕刷新次数,一般屏幕的刷新率是60HZ,现在很多屏幕可以做到120HZ甚至更高。

  • 帧率(FPS):GPU在一秒内绘制的帧数

  • 流畅感知

- 12 fps:由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约10-12帧的时候,就会认为是连贯的

- 24 fps:有声电影的拍摄及播放帧率均为每秒24帧,对一般人而言已算可接受

- 30 fps:早期的高动态电子游戏,帧率少于每秒30帧的话就会显得不连贯,这是因为没有动态模糊使流畅度降低

- 60 fps:在实际体验中,60帧相对于30帧有着更好的体验

1.2 检测方式和定位问题

打开开发者工具 - GPU 渲染模式工具

gpu render.png

图 1. GPU 渲染模式分析图表

渲染模式分析条.png

图 2. GPU 渲染模式分析图表的图例

  • 对于每个可见应用,该工具将显示一个图形。
  • 沿水平轴的每个竖条代表一个帧,每个竖条的高度表示渲染该帧所花的时间(以毫秒为单位)。
  • 水平绿线表示 16 毫秒。要实现每秒 60 帧,代表每个帧的竖条需要保持在此线以下。当竖条超出此线时,可能会使动画出现暂停。
  • 该工具通过加宽对应的竖条并降低透明度来突出显示超出 16 毫秒阈值的帧。
  • 每个竖条都有与渲染管道中某个阶段对应的彩色区段。区段数因设备的 API 级别不同而异。

图中的每个色块的含义请参考阅读Android Developer 渲染

下图是我们媒体应用的 GPU 渲染图片

聚媒体.png

可以看出我们有很多方法 measure 和 upload 耗时很久。

我们可以进一步通过 Android Studio Profiles System Trace 进一步分析

聚媒体AS.png

可以详细看出是哪个 View 的 Measure 方法耗时过久,然后就可以进行针对性优化。

1.2 帧率标准

1.2.1 软件绿色联盟帧率标准

img

img

参考:软件绿色联盟性能标准 冷启动时间 链接

1.2.2 星河帧率标准

用例描述 测量应用内界面时屏幕的帧率(FPS)
预置条件 测量被测应用的滑动帧率
测试方法 1、启动应用,进入应用内界面 2、开展界面滑动(正常使用滑动速度)或刷新 3、统计每秒渲染的帧数(FPS)
判定标准 普通应用的帧率应 ≥ 55FPS游戏类、地图类和视频类的帧率应 ≥ 45FPS

2 布局层次

2.1 定义

  • 过度绘制 是指系统在渲染单个帧的过程中多次在屏幕上绘制某一个像素。例如,如果我们有若干界面卡片堆叠在一起,每张卡片都会遮盖其下面一张卡片的部分内容。但是,系统仍然需要绘制堆叠中的卡片被遮盖的部分。这是因为堆叠的卡片是根据 Painter 算法(也就是按从后到前的顺序)来渲染的。按照这种渲染顺序,系统可以将适当的透明度混合应用于阴影之类的半透明对象。

2.2 检测方法和定位问题

2.2.1 开启过度绘制显示

  1. 在您的设备上,转到 Settings 并点按 Developer Options
  2. 向下滚动到硬件加速渲染部分,并选择调试 GPU 过度绘制
  3. 调试 GPU 过度绘制对话框中,选择显示过度绘制区域

img

2.2.2 过度绘制色块代表含义

img

  • 真彩色:没有过度绘制
  • 蓝色:过度绘制 1 次
  • 绿色:过度绘制 2 次
  • 粉色:过度绘制 3 次
  • 红色:过度绘制 4 次或更多次

下图是我们以车机为例的过度绘制图片

img

智能推荐的过度绘制情况

img

媒体的本地广播过度绘制页面

2.3 标准

2.3.1 星河标准

用例描述 测量应用内界面的绘制层次
预置条件 测量被测应用的绘制层次
测试方法 1、启动应用,进入应用内界面 2、查看每个页面的绘制层次3、统计每个页面不同区域的绘制层次
判定标准 大于1次过度绘制(绿色以及以上色块)区域不超过页面的20%。不能存在3次(粉上)以上的过度绘制。

2.4 如何减少过度绘制

您可以采取以下几种策略来减少甚至消除过度绘制:

  • 移除布局中不需要的背景。
  • 使视图层次结构扁平化。
  • 降低透明度。

本节将分别介绍这几种方法。

移除布局中不需要的背景

默认情况下,布局没有背景,这表示布局本身不会直接渲染任何内容。但是,当布局具有背景时,其有可能会导致过度绘制。

移除不必要的背景可以快速提高渲染性能。不必要的背景可能永远不可见,因为它会被应用在该视图上绘制的任何其他内容完全覆盖。例如,当系统在父视图上绘制子视图时,可能会完全覆盖父视图的背景。

如需查找过度绘制的原因,请在布局检查器工具中浏览层次结构。在浏览过程中,请留意您可以移除的背景,因为它们对用户不可见。在许多容器采用同一种背景颜色的情况下,您也有机会移除不需要的背景:您可以将窗口背景设置为应用的主背景颜色,并且不为其上面的任何容器定义背景值。

使视图层次结构扁平化

借助先进的布局设计方法,您可以轻松对视图进行堆叠和分层,从而打造出精美的设计。但是,这样做会导致过度绘制,从而降低性能,特别是在每个堆叠视图对象都是不透明的情况下,这需要将可见和不可见的像素都绘制到屏幕上。

如果遇到这类问题,您可以通过优化视图层次结构来减少重叠界面对象的数量,从而提高性能。如需详细了解如何实现此操作,请参阅优化视图层次结构

降低透明度

在屏幕上渲染透明像素,即所谓的透明度渲染,是导致过度绘制的重要因素。在普通的过度绘制中,系统会在已绘制的现有像素上绘制不透明的像素,从而将其完全遮盖,与此不同的是,透明对象需要先绘制现有的像素,以便达到正确的混合效果。诸如透明动画、淡出和阴影之类的视觉效果都会涉及某种透明度,因此有可能导致严重的过度绘制。您可以通过减少要渲染的透明对象的数量,来改善这些情况下的过度绘制。例如,如需获得灰色文本,您可以在 TextView 中绘制黑色文本,再为其设置半透明的透明度值。但是,您可以简单地通过用灰色绘制文本来获得同样的效果,而且能够大幅提升性能。

参考文档