美文网首页
性能优化--布局

性能优化--布局

作者: snake_6d77 | 来源:发表于2018-03-05 10:20 被阅读0次

一、布局优化:

1、过度绘制优化:

屏幕上某一像素点在一帧中被重复绘制多次,就是过度绘制。

1)、查看自己应用的过度绘制情况:

方法一:通过开发者选项开启GPU过度绘制调试 

Android手机的开发者选项中有『调试 GPU 过度绘制』的选项:

方法二:通过adb命令开启GPU过度绘制调试 

当然,如果每次都进入系统设置嫌麻烦,可以使用adb命令进行开启和关闭: 

开启『调试 GPU 过度绘制』:

adb shell setprop debug.hwui.overdrawshow

关闭『调试 GPU 过度绘制』:

adb shell setpropdebug.hwui.overdrawfalse

2)、颜色与过度绘制:

原色:没有过度绘制

蓝色:1 次过度绘制

绿色:2 次过度绘制

粉色:3 次过度绘制

红色:4 次及以上过度绘制

在平时的开发中,如果出现粉色及以上的过度绘制情况。说明过度绘制以及很严重了。需要进行优化。

3)、常见的原因以及处理方法:

原因一:

布局文件过多的背景设置导致。

解决办法:Activity自带的默认背景颜色,可以在主题中设置好通用背景色,在各个布局文件中就不需要再次设置背景色。如果某个Activity的

背景色与通用背景色不一致,则可以通过getWidow.setBackgroundDrawable()来设置,在布局文件中就不要重复设置了。同时布局文件内部尽量减少带背景的View产生重叠区域

原因二:

自定义View某区域多次被绘制导致。

解决办法:View最终显示的颜色是最后一次绘制的颜色,不管之前绘制过什么,所以重复绘制区域先前的绘制是没有意义的,要避免同一区域多次绘制的情况出现。

原因三:

布局重叠导致。典型的例子,抽屉布局;抽屉打开的时候,抽屉布局和背后布局重叠在一起了,此时整个屏幕一多半都变成了红色,过度绘制严重

解决办法:

DrawerLayout类通过重写drawChild方法,因为在所有孩子视图绘制之前都会调用drawChild方法,这里只需要对内容区域视图做裁切,当绘制内容区域视图时,取得抽屉视图的位置信息,如果抽屉视图可见、背景为不透明、抽屉高度和父布局高度一致时,取得抽屉视图左、上、右、下边缘在canvas中的位置信息。接着进行裁切,将内容视图未被挡住的部分区域裁切出来,并把裁切完的canvas交由子View进行绘制,这样,内容区域只有在裁切后的区域才会绘制,其他区域不进行绘制。待子View绘制完之后,恢复Canvas到裁切之前的状态,因为一个Window下的所有View都使用的是同一个Canvas,所以需要恢复状态给其他子View使用

2、布局层级优化

为了能够使得APP流畅,我们需要在每一帧16ms以内完成所有的CPU与GPU计算,绘制,渲染等等操作。也就是帧率为60fps,为什么帧率要为60fps呢,因为人眼与大脑之间的协作无法感知超过60fps的画面更新。开发app的性能目标就是保持60fps,这意味着每一帧你只有16ms=1000/60的时间来处理所有的任务。这里需要了解下刷新率和帧率:

Refresh Rate:代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60HZ。

Frame Rate:代表了GPU在一秒内挥之操作的帧数,例如30fps,60fps。

1、首先是善用相对布局Relativelayout

2、布局优化的另外一种手段就是使用抽象布局标签include、merge、ViewStub

3、Android最新的布局方式ConstaintLayout

4、利用Android Lint工具寻求可能优化布局的层次

一些Lint规则如下:

  1、使用组合控件: 包含了一个ImageView以及一个TextView控件的LinearLayout如果能够作为一个组合控件将会被更有效的处理。

        2、合并作为根节点的帧布局(Framelayout) :如果一个帧布局时布局文件中的根节点,而且它没有背景图片或者padding等,更有效的方式是使用merge标签替换该Framelayout标签 。 

  3、无用的叶子节点:通常来说如果一个布局控件没有子视图或者背景图片,那么该布局控件时可以被移除(由于它处于 invisible状态)。

  4、无用的父节点 :如果一个父视图即有子视图,但没有兄弟视图节点,该视图不是ScrollView控件或者根节点,并且它没有背景图片,也是可以被移除的,移除之后,该父视图的所有子视图都直接迁移至之前父视图的布局层次。同样能够使解析布局以及布局层次更有效。

  5、过深的布局层次:内嵌过多的布局总是低效率地。考虑使用一些扁平的布局控件,例如 RelativeLayout、GridLayout ,来改善布局过程。默认最大的布局深度为10 。

3、布局调优工具

(1) hierarchy['haɪərɑrki] viewer 

hierarchy viewer可以方便的查看Activity的布局,各个View的属性、measure、layout、draw的时间,如果耗时较多会用红色标记,否则显示绿色。 

Hierarchy Viewer是随Android SDK发布的工具,位于Android SDK/tools/hierarchyviewer.bat (Windows操作系统,mac上显示的为hierarchyviewer),使用起来也是超级简单,通过此工具可以详细的理解当前界面的控件布局以及某个控件的属性(name、id、height等)。 

1)连接设备真机或者模拟器 

2)启动你要观察的应用。 

3)打开Hierarchyviewer,点击hierarchyviewer文件即可。

View Hierarcy 同时能帮助你识别渲染性能比较低的部分。View节点中带有红色或黄色的点代表速度较慢的View对象。如单步运行应用程序那样,你可以这样来判断某个View 速度一直很慢,还是只在某个特定环境下速度才慢。 

请注意,低性能并不表示一定有问题,特别像是ViewGroup对象,View的子节点越多,结构越复杂,性能越差。 

View Hierarchy 窗口还可以帮助你找到性能问题。只要看每个View节点的性能指标(颜色点)就可以,你可以看到测量(布局或绘制)最慢的View对象是哪个,这样你就能快速确定,要优先察看哪个问题。

相关文章

网友评论

      本文标题:性能优化--布局

      本文链接:https://www.haomeiwen.com/subject/ybicfftx.html