目录
LayoutInspector/Android Device Monitor
UI 优化究竟指的是什么呢?
所谓的 UI 优化,应该包含两个方面:
一个是效率的提升,我们可以非常高效地把 UI 的设计图转化成应用界面,并且保证 UI 界面在不同尺寸和分辨率的手机上都是一致的;
另一个是性能的提升,在正确实现复杂、炫酷的 UI 设计的同时,需要保证用户有流畅的体验。
UI 渲染的背景知识
1. 屏幕与适配
屏幕的尺寸从 3 英寸到 10 英寸,分辨率从 320 到 1920 应有尽有,除此之外,材质也是屏幕至关重要的一个评判因素。目前智能手机主流的屏幕可分为两大类:一种是 LCD(Liquid Crystal Display),即液晶显示器;另一种是 OLED(Organic Light-Emitting Diode 的)即有机发光二极管。
对于屏幕碎片化的问题,Android 推荐使用 dp 作为尺寸单位来适配 UI。
2. CPU 与 GPU
除了屏幕,UI 渲染还依赖两个核心的硬件:CPU 与 GPU。UI 组件在绘制到屏幕之前,都需要经过 Rasterization(栅格化)操作,而栅格化操作又是一个非常耗时的操作。GPU(Graphic Processing Unit )也就是图形处理器,它主要用于处理图形运算,可以帮助我们加快栅格化操作。
可以从图上看到,软件绘制使用的是 Skia 库,它是一款能在低端设备如手机上呈现高质量的 2D 跨平台图形框架,类似 Chrome、Flutter 内部使用的都是 Skia 库。
3. OpenGL 与 Vulkan
对于硬件绘制,我们通过调用 OpenGL ES 接口利用 GPU 完成绘制。OpenGL是一个跨平台的图形 API,它为 2D/3D 图形处理硬件指定了标准软件接口。而 OpenGL ES 是 OpenGL 的子集,专为嵌入式设备设计。
Android 7.0 把 OpenGL ES 升级到最新的 3.2 版本同时,还添加了对Vulkan的支持。Vulkan 是用于高性能 3D 图形的低开销、跨平台 API。相比 OpenGL ES,Vulkan 在改善功耗、多核优化提升绘图调用上有着非常明显的优势。在国内,“王者荣耀”是比较早适配 Vulkan 的游戏,虽然目前兼容性还有一些问题,但是 Vulkan 版本的王者荣耀在流畅性和帧数稳定性都有大幅度提升,即使是战况最激烈的团战阶段,也能够稳定保持在 55~60 帧。
UI优化主要分为三部分:
第一部分,系统为我们做的优化。
由于前端中UI展示的特殊性和重要性,Android团队也是在不断想办法提高UI方面的渲染速度,所以也是更新了很多系统优化方案,比如:硬件加速、黄油计划、RenderThread。
第二部分,我们可以具体实施的优化方案。
主要包括:java代码布局、View重用、异步创建View、xml布局优化、异步布局框架Litho、屏幕适配、Flutter、Jetpack Compose。
第三部分,工具使用。
主要包括:Choreographer、monitor、Systrace
系统做的优化
硬件加速
上面介绍过,一个图形的绘制是CPU,GPU和屏幕三方合作的结果。在Android3.0之前,还没有硬件加速,都是通过CPU进行数据计算,然后通过Skia库进行软件绘制,但是CPU对于图形处理并不高效。
于是从3.0开始,Android支持了硬件加速,到Android4.0默认开启硬件加速。开启硬件加速后,就是由CPU进行图形缓存数据的绘制。这样CPU和GPU就能比较好的分工,各司其职了。CPU用于控制复杂绘制逻辑、构建或更新DisplayList(基础元素);GPU用于完成图形计算、渲染DisplayList(基础元素)。
这里也找了一张各种场景下,硬件加速前后的流程与加速效果(Android6.0背景):
但是硬件加速也是有缺点的:
- 启用硬件加速需要更多资源,因此应用会占用更多内存。
- 比较低的版本,由于有些Canvas API还没有支持,所以使用硬件加速可能会有问题。那么我们就可以手动关闭某个view的硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
Project Butter
黄油计划,