大厂架构师经验分享!Android-性能优化最佳实践( 二 )


可能又有人说了:背景复用了,嵌套已经很精简了,再精简就实现了不了复杂视图了,可是还是一路飘红,这个怎么办?面对这个问题谷歌给了我们一个新的布局 。
可以有效地解决布局嵌套过多的问题 。使用约束的方式来指定各个控件的位置和关系的,它有点类似于,但远比要更强大(照抄隔壁IOS的约束布局) 。所以简单布局简单处理,复杂布局很好使,提升性能从布局做起 。
再次进化:
优化 1.2 复杂界面可选择,可有效减少层级
2、绘制优化
我们把布局优化了,但是和布局息息相关的还有绘制,这是直接影响显示的两个根本因素 。
其实布局优化了对于性能提升影响不算很大,但是是我们最容易下手,最直接接触的优化,所以不管能提升多少,哪怕只有百分之一的提升,我们也要做,因为影响性能的地方太多了,每个部分都提升一点,我们应用就可以提升很多了 。
我们平时感觉的卡顿问题最主要的原因之一是因为渲染性能,因为越来越复杂的界面交互,其中可能添加了动画,或者图片等等 。我们希望创造出越来越炫的交互界面,同时也希望他可以流畅显示,但是往往卡顿就发生在这里 。
这个是的渲染机制造成的,系统每隔16ms发出VSYNC信号,触发对UI进行渲染,但是渲染未必成功,如果成功了那么代表一切顺利,但是失败了可能就要延误时间,或者直接跳过去,给人视觉上的表现,就是要么卡了一会,要么跳帧 。
View的绘制频率保证60fps是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证16ms这个时间,但是尽量降低方法中的复杂度总是切实有效的 。
这个正常情况下,每隔16ms draw()一下,很整齐,很流畅,很完美 。
往往会发生如下图的情况,有个便秘的家伙霸占着,一帧画面拉的时间那么长,这一下可不就卡顿了嘛 。把后面的时间给占用了,后面只能延后,或者直接略过了 。
既然问题找到了,那么我们肯定要有相应的解决办法,根本做法是 减轻()的负担 。
所以
第一点: 方法中不要做耗时的任务,也不做过多的循环操作,特别是嵌套循环,虽然每次循环耗时很小,但是大量的循环势必霸占CPU的时间片,从而造成View的绘制过程不流畅 。
第二点: 除了循环之外,()中不要创建新的局部对象,因为()方法一般都会频繁大量调用,就意味着会产生大量的零时对象,不进占用过的内存,而且会导致系统更加频繁的GC,大大降低程序的执行速度和效率 。

大厂架构师经验分享!Android-性能优化最佳实践

文章插图
其实这两点在的UI线程中都适用 。
升级进化:
优化2.0 中不要创建新的局部对象方法中不要做耗时的任务
其实从渲染优化里我们也牵扯出了另一个优化,那就是内存优化 。
3、内存优化
内存泄漏指的是那些程序不再使用的对象无法被GC识别,这样就导致这个对象一直留在内存当中,占用了没来就不多的内存空间 。
内存泄漏是一个缓慢积累的过程,一点一点的给你,温水煮青蛙一般,我们往往很难直观的看到,只能最后内存不够用了,程序奔溃了,才知道里面有大量的泄漏,但是到底是那些地方?估计是狼烟遍地,千疮百孔,都不知道如何下手 。怎么办?最让人难受的是内存泄漏情况那么多,记不住,理解也不容易,关键是老会忘记 。怎么办呢?老这么下去也不是事,总不能面试的时候突击,做项目的时候不知所措吧 。所以一定要记住了解GC原理,这样才可以更准确的理解内存泄漏的场景和原因 。不懂GC原理的可以先看一下这个JVM初探:内存分配、GC原理与垃圾收集器