【Android】性能优化

1 内存优化

1.1 垃圾回收
1.2 内存监控

方法一:
Android Studio 3.0 及更高版本中的 Android Profiler 取代了 Android Monitor 工具。

方法二:
使用LeakCanary查看应用中谁在泄漏内存:
https://github.com/square/leakcanary
https://square.github.io/leakcanary/getting_started/

使用简单到令人发指:只要添加如下依赖即可!!

dependencies {
  // debugImplementation because LeakCanary should only run in debug builds.
  debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5'
}
1.3 内存泄漏案例

(1)如果传入了一个activity对象给instance,就会引发问题。静态对象instance在app运行期间会一直存在,如果把Activity给到他手里,那么这个Activity就会被instance一直持有,得不到释放,这就是所谓的内存泄漏。
在这里插入图片描述

(2)这个sResource是个潜在风险。sResource是Activity中的一个非静态内部类,但是在Activity中创建这个对象时,这个对象其实持有了Activity对象,可怕的是这个对象竟然被定义成了静态对象,那么静态对象在app运行期间不会被释放,导致Activity也不会被释放,从而发生内存泄漏。
在这里插入图片描述

(3)mHandler是Handler类的一个对象,他是通过构建匿名对象的方法构建出来的,这个匿名对象被创建的时候,会间接持有外部类的实例的引用,此处这个匿名对象就持有了Activity的对象的引用。mHandler一般用来做一些耗时操作,他的存活周期一般比这个Activity要长很多,导致Activity在销毁后无法及时地被垃圾回收掉,造成内存泄漏。
在这里插入图片描述

1.4 如何避免内存泄漏

(1)尽量不要让静态变量引用Activity
(2)如果非得想让静态变量引用Activity的话可以使用弱引用,WeakReference会保证在垃圾回收时,把它引用的对象回收掉
(3)使用静态内部类来代替内部类,因为静态内部类本身是不会持有他的外部类的引用的
(4)在静态内部类中使用弱引用来引用外部类
(5)及时释放资源
在这里插入图片描述

1.5 如何减少内存使用

在这里插入图片描述

2 视图优化

60fps:60帧每秒,就是每秒显示60帧图像。使用户感受到足够的流畅。
24fps:电影院常用。

VSYNC

刷新率:屏幕的刷新频率,一般60Hz。
帧率:GPU一秒内绘制的帧数,一般30fps和60fps。
通常,帧率和刷新率要一起配合,将应用完美流畅地渲染出来。

GPU会按照一定的频率,将读到的数据渲染出来,并将渲染结果写入到缓冲区中;
屏幕会按照一定的频率,去GPU的缓冲区中读取数据并显示。

(1)问题1
如果GPU帧率大于屏幕刷新率,会出现图片断层问题。因为GPU是一行一行渲染图片,而屏幕则一次性读取完毕,屏幕读取的时候并不知道GPU有没有渲染完这张图片。如果GPU渲染到一半,就被屏幕读走了,就可能出现断层现象。

为了解决上述问题,运用双缓冲机制解决问题。

GPU只将数据写入到BackBuffer,屏幕只从FrameBuffer读取数据。VSYNC的作用就是将数据从BackBuffer同步到FrameBuffer,它会在屏幕读取完当前帧后再写入新的一帧,避免割裂现象。

(2)问题2
如果GPU帧率小于屏幕刷新率,屏幕的两次刷新,用的数据可能是同一帧数据,用户会觉得卡顿。

过度绘制

一个像素绘制超过1次。
追踪过度绘制:开发者选项中:

(1)调试GPU过度绘制,可选择显示过度绘制区域

在这里插入图片描述

(2)GPU呈现模式分析:可选择在屏幕上显示为条形图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

如何避免UI卡顿

在这里插入图片描述

如何优化过度绘制

在自定义控件的时候用ClipRect和QuickReject。卡片叠加时,只绘制显示给用户的那部分。
ViewStub。在真正被显示出来的时候才绘制。
.9图,中间可以做成无背景,这样就只会绘制边框,而不绘制背景。
在这里插入图片描述

3 电量优化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值