全网最新:面向Android开发中的“卡顿问题及解决方法”

前言
开发中卡顿问题一直是个比较棘手又重要的问题,严重影响用户体验;卡顿是人的一种视觉感受,比如我们滑动界面时,如果滑动不流畅我们就会有卡顿的感觉,这种感觉我们需要有一个量化指标,在编程时如果开发的程序超过了这个指标我们认为其是卡顿的
开发app的性能目标就是保持60fps,这意味着每一帧你只有16ms≈1000/60的时间来处理所有的任务;系统每隔16ms发出VSYNC信号,触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps
什么是卡顿呢?
安卓APP卡顿问题,就是UI渲染过慢;如果计算跟绘制,让界面的帧率在1秒内达到60fps,APP视觉效果当然达到自然流畅;可如果在16ms内不能完成界面的渲染,占了下n个16ms的时间,相当于丢了n帧,丢帧的产生就会造成应用卡顿现象的出现,严重影响了用户体验感,这是开发者必须要重视的问题
APP中主要表现在页面的刷新,滑动时的流畅度;例如玩游戏的时候卡,或者听歌的时候画面滞帧,也就是通常人们所说的“卡”;开发者中有一个卡顿16ms原则,每一帧渲染时间不能超过16ms,应达到60帧每秒,如果UI渲染过慢,就会发生丢帧,丢帧的出现就会产生画面的不连贯性,就是卡顿
什么是过度绘制?
(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了N次;但是我们只能看到最上层的UI,这就会导致多层次的UI界面除最上层外对用户都是不可见的,这样就会浪费大量的CPU以及GPU资源,浪费可耻
这就像我们在纸上固定区域不断图画,但是有最上层最接近你,其他层有个鬼用?
解决过度绘制
● 我们在写的时候,如果的父布局、、item三者的背景只要其中一个设置就可以了,没有设置背景就不会渲染,否则就会有过度绘制的情况
● 父布局套子布局也是尽量只设置其中一个背景,除非没办法都需要背景
● 子view一般绘制后是会覆盖父view,所以一般选择把背景设置在子view
● 视图的层级结构能减少就减少,层级越多绘制速度越慢
● 尽量少设置view的透明度,如果一个view设置了alpha,那他需要知道下面的view是什么内容,再绘制自己,就是过度绘制 。如果是文字有透明度,可以在色号里就设置好
如何查看绘制维度
● 开发工具有 View、、Track等
● 真机在开发者选项中有:调试GPU绘制、硬件层更新、GPU视图更新等等
界面优化
在编写布局时总会遇到这样或者那样的痛点,比如:
● 有些布局的在很多页面都用到了,而且样式都一样,每次用到都要复制粘贴一大段,有没有办法可以复用呢?
● 解决了问题之后,发现复用的布局外面总要额外套上一层布局,要知道布局嵌套是会影响性能的呐
● 有些布局只有用到时才会显示,但是必须提前写好,虽然设置了为或gone,还是多多少少会占用内存的
首先第一点也是最重要的一点,在刚开始写布局的时候一定要提前想好和规划好,尽可能的减少层级的嵌套

全网最新:面向Android开发中的“卡顿问题及解决方法”

文章插图
往往越复杂的布局越臃肿,越容易被忽视进而出现性能问题,所以我们写布局就要知道一些技巧来展示布局
● 如果图片和文字在一起且文字不动态变的话,可以直接使用带文字的图片
● 移除没用的布局和控件,假设添加个背景,尽可能在已经布局上放,减少只有背景功能的控件
● 减少透明度的使用,假设:# 和 # 颜色类似,建议使用后者,因为前者有Alpha,view需要至少绘制两次
● 去掉多余的不可见颜色背景、图片等,只保留最上层用户可见即可