android之app流畅度分析

大多数人感觉卡顿等性能问题的最主要根源都是因为渲染性能。从设计师的角度,他们希望App能够有更多的动画,图片等时尚元素来实现流畅的用户体验。但是Android系统很有可能无法及时完成那些复杂的界面渲染操作。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着程序的大多数操作都必须在16ms内完成、时间超出16ms越多,丢的帧就越多(可以大概估计5秒没响应抛出anr异常期间丢了多少帧,5000/16=312帧)

 

1流畅度相关概念了解

刷新率vs帧率

刷新率:每秒屏幕刷新次数,手机屏幕的刷新率是60HZ

帧数:FPS (FPS是帧数,越高越好,手机一般在60左右)
帧率:GPU在一秒内绘制的帧数(1000ms/帧数=帧率),越低越好

丢帧

Android系统每隔16ms发出VSYNC信号,触发GPU对UI进行渲染,如果你的某个操作花费时间是24ms,系统在得到VSYNC信号的时候由于还没有准备好,就无法进行更新任何内容,那么用户在32ms内看到的会是同一帧画面(卡顿现象),即丢帧现象。

 

1. 高动画流畅性需求页面

 

  • 首先开启自带的GPU图形呈现器(每帧是否超过16ms。即是否达到60帧,低于30帧需要提交报告

  • Android studio monitor 查看各项指标(备选)

  • adb shell dumpsys gfxinfo PackageName(导出最近120帧的各线程的gpu渲染信息)

  • Trepn Profiler 查看各项指标(查看最近所有的信息,最全,并导出excel)

2. 普通动画

  • 开启自带的GPU图形呈现器(每帧是否超过16ms的线。即是否达到60帧,低于15帧需要提交报告
备注:
不是。一般人肉眼能分辨的fps不超过60。实际上大部分人看30fps以上的画面就已经感觉流畅了。
30fps还是必要的。60以上则无意义。
 
现在的App每秒中最多能绘制60帧,1000ms/60帧=16.67ms/帧,也就是说对图像绘制的要求是平均每帧的绘制时间为16.67ms,超过了这个时间就可能造成不流畅的现象。
 
2.通过命令查看app的帧率
帧率 adb shell dumpsys gfxinfo 包名

这里将逐一解释以上重点信息:

  • Graphics info for pid 31148 [com.android.settings]: 表明当前dump的为设置界面的帧信息,pid为31148
  • Total frames rendered: 105 本次dump搜集了105帧的信息
  • Janky frames: 2 (1.90%) 105帧中有2帧的耗时超过了16ms,卡顿概率为1.9%
  • Number Missed Vsync: 0 垂直同步失败的帧
  • Number High input latency: 0 处理input时间超时的帧数
  • Number Slow UI thread: 2 因UI线程上的工作导致超时的帧数
  • Number Slow bitmap uploads: 0 因bitmap的加载耗时的帧数
  • Number Slow issue draw commands: 1 因绘制导致耗时的帧数
  • HISTOGRAM: 5ms=78 6ms=16 7ms=4 ... 直方图数据,表面耗时为0-5ms的帧数为78,耗时为5-6ms的帧数为16,同理类推。
 

在应用性能的世界里,你总能听见有人讨论60帧每秒和16毫秒的界限。但是你有没有停下来问,为什么是这些数值?如果你是严肃对待性能问题的开发人员,这就是一个值得研究的技术细节。

让我们回想一下,要知道,这些大部分都和硬件——人体硬件有关。人的眼睛和相机不同,眼睛并不会向大脑发送这个世界的截图。相反,你的大脑会持续的处理你的眼睛传送的可视图像。但是这里并没有帧和截图的概念。我们这种动作是由帧组合的概念,实际上是由一个骇客破解。因为如果能足够快速的显示图像,我们就可以欺骗人类大脑,让他们以为眼前的帧就是动作。

这里我们需要注意的就是图像显示速度的快慢很大地影响了动作的流畅性,最少你会需要10-12帧每秒的速度才能让人类大脑相信这些图像是一个动作。

24帧每秒时,人眼会看到流畅的画面,但这要多亏运动模糊这些视觉效果。另外,24帧每秒对电影行业来说非常重要,因为它对展现动作来说已经足够了,同时制作成本也足够低,能满足电影制作的预算。这也就是为什么在过去50年里,你所看到的大部分电影,都是24帧每秒的。现在30帧每秒对电影来说已经足够,但是没有华丽的影院效果,它并没有那么使人信服。

事实上60帧每秒才是最棒的,不需要那些视觉效果,却依然精彩流畅。大部分人接受不了比这更高的帧数。现在值得注意的是,针对图片的非连续性,人眼的辨识力还是非常高的。例如,如果你以60帧每秒的速度运动,然后时不时突然降至20帧每秒,人眼就会察觉到这里面的不流畅性。这会导致用户的紧张和不适应。

作为应用开发人员,你的目标很清晰,那就是保证你的应用在60帧每秒,并在用户体验期间保持这个速度不变。60帧每秒意味着作为一个开发人员你要在16毫秒每帧(1000ms / 60frame = 16.666ms/frame)的情况下完成所有的工作,包括输入、计算、网络传输和渲染等。只有这样,你的应用才会有流畅的用户体验。

事实上,很多问题会导致你的帧会超过16毫秒,为了找到这些问题并解决他们,你要查看其它的Android性能模式内容,别忘了加入我们的Google+社区一起参加讨论。请记住:保持淡定,分析代码,性能很重要。

 

备注:

Android性能测试主要分为:帧率fps、静默CPU占用率、内存泄漏、流量、响应时间、过度渲染等,
app性能测试主要关注在启动耗时、内存占用(内存泄漏、内存溢出、内存抖动、卡顿等)、电量耗用、流量耗用、CPU占用、FPS(帧率和流畅度)

 

 

相关连接:

https://www.cnblogs.com/sushi/p/7682996.html............................................................adb获取Android性能数据

https://www.cnblogs.com/wutaotaosin/articles/11780688.html  .....................................perfdog分析与讲解

https://www.cnblogs.com/hewei2012/p/12851938.html  ...............................................perfdog参数介绍

https://blog.csdn.net/baidu_41666295/article/details/103531200 ...............................获取性能数据 (CPU、内存、流量)

https://blog.csdn.net/weixin_43291944/article/details/98497689 ..............................专项测试-如何测试APP流畅度,基于adb命令来获取fps和丢帧率

https://blog.csdn.net/sunfengye/article/details/77497893 ........................................通过python调用adb命令对app进行性能测试

https://www.cnblogs.com/123blog/articles/12410943.html  ..............python自动化android应用性能测试- 绘制为图表

https://mp.weixin.qq.com/s?__biz=MzA4NDUyNzA0Ng==&mid=2247488784&idx=1&sn=71f5eafae6a41ea78fb5ecab87ca04c6 ..............app专项性能测试

 

 

posted on 2019-07-23 11:50  chen_2987  阅读(1024)  评论(0编辑  收藏  举报

导航