亲好鉴定

渲染性能优化

2019-03-28  本文已影响12人  simplehych

0x01 背景概念

0x02 Android UI 渲染流程

androiduitogpu.png

CPU 负责把 UI 组件计算成 Polygons/Texture 纹理保存在 DisplayList 中 -> GPU进行栅格化渲染 -> 屏幕上显示

0x03 运行机制

GPU(Graphics Processing Unit)会获取图形数据进行渲染。然后硬件负责把渲染后的内容呈现到屏幕上,二者不停的进行协作。

但是,如果刷新频率和帧率不能保持相同的节奏工作时,就会出现 Tearing 的现象。

当帧率比刷新频率快时,通常标准帧率60fps,即当>60fps时,GPU 所产生的数据会因为等待 VSYSNC 的刷新信息而被 Hold 住,这样就能保证每次刷新都有实际的新数据可以显示。

当帧率比刷新频率慢时,即<60fps时,某些帧的显示画面就会和上一帧的画面相同,发生卡顿掉帧的不顺滑的情况。

除了垂直同步外,Android 还使用了缓冲的方式使动效更顺畅。

Android 采用双缓冲机制,在显示一帧的同时进行另一帧的处理。缓冲就是帧构建和保存的容器,缓冲 A 和 B,当显示缓冲 A 时,系统在缓冲 B 中构建新的帧,完成后则交换缓冲。显示缓冲 B,而 A 则被清空,继续下一帧的绘制。

当某帧的绘制时间超过 16ms 时,双缓冲就会导致,一步慢步步慢的情况。为此引入三缓冲,在 B 缓冲超时,而 A 缓冲用于当前帧的显示中,系统会创建缓冲 C,并继续下一帧的工作。三倍缓冲结束了频繁卡顿的产生,在初始化跳顿后,用户得到了平滑的动画效果。即使有些问题发生了,但系统还是会努力给用户满意的结果。

但是,系统没有一直使用三倍缓冲,因为三倍缓冲在整个过程中引入了一些输入延迟。所以出现某些错误行为时,你有两个选项:输入延迟(触摸操作生效时间延长)或者画面卡顿。为解决这个问题,没有一直使用三倍缓冲,一般情况下,只使用了双缓冲,当需要的时候用三倍缓冲来进行增强。

0x04 造成渲染性能的原因

CPU 或 GPU 负载过量,导致 16ms 内没有渲染完成。CPU 通常存在的问题的原因是存在非必须的视图组件,它不仅仅会带来重复的计算操作,而且还会占用额外的 GPU 资源


renderproblem.png

0x05 工具检查

1. HierarchyViewer 查看布局树结构

hiearachyviewer.png

2. 开发者选项 Show GPU Overdraw 查看视图重绘

overdraw.png

3. 开发者选项 Profile GPU Rendering 查看渲染时间

gpurendering.png
gpurenderingdes.png

4. 开发者选项 Show GPU view updates 查看视图更新操作

界面发生更新操作进行闪烁

5. Lint

Android Studio -> Analyze -> Inspect Code

6. TraceView

方式一:代码 Debug.startMethodTracing/stopMethodTracing

这俩个函数运行过程中采集运行时间内该应用的所有线程(只能是 Java 线程)的函数执行情况,最后生成.trace文件保存在/mnt/sdcard/android/package/files文件夹中。利用TraceView工具分析数据

方式二:DDMS

traceview.png
列名 描述
Name 该线程运行过程中所调用的函数名
Incl Cpu Time 某函数占用的 CPU 时间,包含内部调用其它函数的 CPU 时间
Incl Real Time 同Incl Cpu Time,统计单位为真实时间 ms
Excl Cpu Time 某函数占用的 CPU 时间,不包含内部调用其它函数的 CPU 时间
Excl Real Time 同Excl Cpu Time ,统计单位为真实时间 ms
Call + Recur Calls/Total 某函数被调用次数以及递归调用占总调用次数的百分比
Cpu Time/Call 某函数调用CPU 时间与调用次数的比,相当于该函数平均执行时间
Real Time/Call 同 CPU Time/Call,统计单位为真实时间 ms

7. Systrace

方式一:命令行

/sdk/platform-tools/systrace

python ./systrace.py [options] [categories]

通用的命令:
python ./systrace.py -t 10 -a <package_name> -o xxtrace.html app sched gfx view am wm dalvik binder_driver freq idle load sync

方式二:DDMS

systrace.png

生成.html文件,在浏览器中打开


systraceres.png
颜色 状态
灰色 Sleeping
蓝色 Runnable 可以运行但是需要等待调度唤醒
绿色 Running
橙色 uninterruptiable sleep 由于 I/O 负载而不可中断休眠

尤其关注 Runnable,很可能wake by pid xxx,cpu 此时被 xxx 进程抢占着,查看这个进程是否有异常

0x06 优化技巧

0x07 参考资料

感谢以下文章作者
Android性能优化之渲染篇

上一篇 下一篇

猜你喜欢

热点阅读