Demo:Advanced
Android性能优化之渲染篇
px
px = density * dp
像素点,如手机分辨率320x480表示宽有320像素。高有480像素
ppi
ppi等于或约等于dpi
像素密度,每英寸所包含的像素数目,这个是屏幕物理参数。
dpi
像素密度,在系统软件上指定的单位尺寸的像素数目。跟ppi不同的是,dpi可能会被人为调整。
dp
px = dp * (dpi / 160)
基于屏幕物理分辨率一个抽象的单位,用于说明与密度无关的尺寸和位置。
density
density = dpi / 160
密度,屏幕上每平方英寸中含有的像素点数量。
屏幕适配
尽量使用硬件加速
硬件加速绘制的性能是远远高于软件绘制。
异步创建
View 重用
ListView、RecycleView 通过 View 的缓存与重用大大地提升渲染性能。
减少 UI 布局层次。例如尽量扁平化,使用<ViewStub><Merge>等优化。
优化 layout 的开销。尽量不使用 RelativeLayout 或者基于 weighted LinearLayout,使用 ConstraintLayout 替代 RelativeLayout 或者 weighted LinearLayout。
背景优化。尽量不要重复去设置背景,这里需要注意的是主题背景(theme), theme 默认会是一个纯色背景,如果我们自定义了界面的背景,那么主题的背景我们来说是无用的。但是由于主题背景是设置在 DecorView 中,所以这里会带来重复绘制,也会带来绘制性能损耗。
onDraw中避免创建大对象,进行耗时操作。
TextView的优化,比如利用它的drawableLeft属性。此外,也可以使用Android 9.0之后的 PrecomputedText,它将文件的measure与layout过程进行了异步化。
其他
Litho:异步布局
声明式:它使用了声明式的API来定义UI组件。
异步布局:它可以提前布局UI,而不会阻塞UI线程。
视图扁平化:它使用了Facebook开源的另一款布局引擎Yoga进行布局,以自动减少UI包含的ViewGroup数量。
细粒度的回收:可以回收文本或图形等任何组件,并可以在用户界面的任何位置重复使用。
内部不仅支持使用View来渲染视图,还可以使用更轻量的Drawable来渲染视图。Litho实现了大量使用Drawable来渲染的基础组件,可以进一步使布局扁平化。
Flutter:自己的布局 + 渲染引擎
RenderThread:异步渲染动画