内存管理-----UI卡顿篇

首要声明:此文是本人在学Android自行总结的知识点,如果帮到你们我会很高兴。如果大佬们发现本文有错误的地方请指出,我会了解并进行改正。
本文主要讲的是:内存管理-----UI卡顿篇。
我是通过一下思路进行总结的:

  1. 首先我们要知道为什么会出现卡顿?
  2.再接着我们要知道是什么会引起卡顿?
  3.当我们知道问题的所在之处后,我们应该了解怎样解决他。

在这里插入图片描述

接触安卓的老铁们,一定大多都知道 16ms 原则吧。

所谓16ms 原则 :即Android 系统会每隔16ms 会发出VSYNSC信号重新绘制我们的activity界面。为什么是16毫秒呢?这是因为Android设定刷新频率是60FPS(Frame Per Second),也就是说每秒60帧刷新率,约合16ms刷新一次卡顿;

从用户的角度来说:App操作起来缓慢,相应不及时,列表滑动一顿一顿,动画刷新不流畅等等一些直观感受。
从系统角度来说:屏幕刷新帧率不稳定,无法保证每帧绘制60帧,也就是说有掉帧情况。

UI卡顿的原理:Android 每隔16ms就会绘制一次activity,通过上述结论我们知道,如果一些原因导致了我们的逻辑cpu耗时,Gpu耗时大于16ms,UI无法完成一次绘制,那么就会造成卡顿。

过度绘制:overdraw(过度绘制)描述了某个项目在同一帧被绘制了多次。在多层次UI结构里面,如果不可见UI也做了绘制操作,这就会导致 某些像素区域内被绘制了多次,这就浪费了大量cpu以及Gpu资源。我们可以开启调试工具,打开开发者设置 显示Gpu过度绘制显示情况。一般步骤:设置 ->开发者选项 ->调试cpu过度绘制 ->显示cpu过度绘制。

深红:意味着overdraw 4倍 ,像素绘制了5次甚至更多次,这是错误的,需要修复;
淡红:意味着overdraw3倍 ,像素绘制了4次,小范围可以接受;
绿色:意味着overdraw 2倍 ,像素绘制了3次,中等大小绿色区域是可以接受的,但是还是应该优化,减少他们;
蓝色:意味着overdraw 1倍 ,像素绘制了2次,大片蓝色还是可以接受的。

常见卡顿原因以及解决方案
一.过度绘制
1.去除不必要的背景色:

  • 设置窗口景色为通用背景色,去除根部局背景色。
  • 若页面背景色与通用背景色不同一致,在页面渲染完成后移除窗口背景色。
  • 去除和列表相同item背景色。

2.布局视图扁平化

  • 移除嵌套布局
  • 使用merge ,include标签
  • 使用性能更小的布局(ConstraintLayout)

3.减少透明色的使用,alpha的使用

  • 通过半透明色值代替(#77000000)代替

二.UI线程的复杂运算(ANR为卡顿极致)

解决方式:使用Traceview工具分析

三.频繁的GC

  • 频繁GC的原因: 内存抖动:即大量对象被创建又在短时间内马上被释放 瞬间产生大量对象会严重占用Young Generation 内存区域
  • 当达到阀值,剩余空间不够时候,也会出发GC,每次分配对象需要占用很少内存,但是叠加在一起会增加heap压力,从而触发更多GC。

解决方案:瞬间大量产生对象一般因为我们在代码循环中new对象,或是在onDraw 中创建对象等。尽量不要在大循环中大量使用局部变量。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值