Android 关于提高性能方面(卡顿)

主要有以下三方面:

 1.业务/功能

 2.符合逻辑的交互

 3.优秀的性能

Android 系统作为以移动设备为主的操作系统,硬件配置是有一定的限制的,虽然配置现在越来越高级,但仍然无法与 PC 相比,在 CPU 和内存上使用不合理或者耗费资源多时,就会碰到内存不足导致的稳定性问题、CPU 消耗太多导致的卡顿问题等。


具体的性能问题总结:

户体验的性能问题:

 1.流畅

 2.稳定

 3.省电、省流量

 4.安装包小


 快:使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望。

 稳:减低 crash 率和 ANR 率,不要在用户使用过程中崩溃和无响应。

 省:节省流量和耗电,减少用户使用成本,避免使用时导致手机发烫。

 小:安装包小可以降低用户的安装成本。


要想达到这4个目标,具体实现是在右边框里的问题:卡顿、内存使用不合理、代码质量差、代码逻辑乱、安装包过大,这些问题也是在开发过程中碰到最多的问题,在实现业务需求同时,也需要考虑到这点,多花时间去思考,如何避免功能完成后再来做优化,不然的话等功能实现后带来的维护成本会增加。


卡顿上的优化:
UI 绘制、应用启动、页面跳转、事件响应



这4种卡顿场景的根本原因可以分为两大类:


 1.界面绘制。主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在 UI 和启动后的初始界面以及跳转到页面的绘制上。

 2.数据处理。导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到时间片,三是内存增加导致 GC 频繁,从而引起卡顿。


造成卡顿的根本原因:

根据Android 系统显示原理可以看到,影响绘制的根本原因有以下两个方面:

 1.绘制任务太重,绘制一帧内容耗时太长。

 2.主线程太忙,根据系统传递过来的 VSYNC 信号来时还没准备好数据导致丢帧。


绘制耗时太长,有一些工具可以帮助我们定位问题。主线程太忙则需要注意了,主线程关键职责是处理用户交互,在屏幕上绘制像素,并进行加载显示相关的数据,所以特别需要避免任何主线程的事情,这样应用程序才能保持对用户操作的即时响应。总结起来,主线程主要做以下几个方面工作:

  • 1.UI 生命周期控制

  • 2.系统事件处理

  • 3.消息处理

  • 4.界面布局

  • 5.界面绘制

  • 6.界面刷新

除此之外,应该尽量避免将其他处理放在主线程中,特别复杂的数据计算和网络请求等。



解决卡顿的优化:


1,布局优化


布局是否合理主要影响的是页面测量时间的多少,我们知道一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h有关,其时间复杂度 O(h),如果层级太深,每增加一层则会增加更多的页面显示时间,所以布局的合理性就显得很重要。


那布局优化有哪些方法呢,主要通过减少层级、减少测量和绘制时间、提高复用性三个方面入手。


总结如下:


  • 1.减少层级。合理使用 RelativeLayout 和 LinerLayout,合理使用Merge。

  • 2.提高显示速度。使用 ViewStub,它是一个看不见的、不占布局位置、占用资源非常小的视图对象。

  • 3.布局复用。可以通过<include> 标签来提高复用。

  • 4.尽可能少用wrap_content。wrap_content 会增加布局 measure 时计算成本,在已知宽高为固定值时,不用wrap_content 。

  • 5.删除控件中无用的属性。


2,避免过度绘制


过度绘制是指在屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的 UI 结构中,如果不可见的 UI 也在做绘制的操作,就会导致某些像素区域被绘制了多次,从而浪费了多余的 CPU 以及 GPU 资源。


如何避免过度绘制呢,如下:


  • 1.布局上的优化。移除 XML 中非必须的背景,移除 Window 默认的背景、按需显示占位背景图片

  • 2.自定义View优化。使用 canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。


3,启动优化


通过对启动速度的监控,发现影响启动速度的问题所在,优化启动逻辑,提高应用的启动速度。启动主要完成三件事:UI 布局、绘制和数据准备。因此启动速度优化就是需要优化这三个过程:


  • 1.UI 布局。应用一般都有闪屏页,优化闪屏页的 UI 布局,可以通过 Profile GPU Rendering 检测丢帧情况。

  • 2.启动加载逻辑优化。可以采用分布加载、异步加载、延期加载策略来提高应用启动速度。

  • 3.数据准备。数据初始化分析,加载数据可以考虑用线程初始化等策略。


4,合理的刷新机制


在应用开发过程中,因为数据的变化,需要刷新页面来展示新的数据,但频繁刷新会增加资源开销,并且可能导致卡顿发生,因此,需要一个合理的刷新机制来提高整体的 UI 流畅度。合理的刷新需要注意以下几点:


  • 1.尽量减少刷新次数。

  • 2.尽量避免后台有高的 CPU 线程运行。

  • 3.缩小刷新区域。


5,其他


在实现动画效果时,需要根据不同场景选择合适的动画框架来实现。有些情况下,可以用硬件加速方式来提供流畅度。

猜你喜欢

转载自blog.csdn.net/Keepsty/article/details/79169038
今日推荐