当前位置: 首页 > 编程笔记 >

Android 优化之卡顿优化的实现

齐承泽
2023-03-14
本文向大家介绍Android 优化之卡顿优化的实现,包括了Android 优化之卡顿优化的实现的使用技巧和注意事项,需要的朋友参考一下

Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。之所以是 16ms,是因为 Android 设定的刷新率是 60FPS(Frame Per Second),也就是每秒 60 帧的刷新率,约合 16ms 刷新一次。

这就意味着,我们需要在 16ms 内完成下一次要刷新的界面的相关运算,以便界面刷新更新。

假设我们更新屏幕的背景图片需要 24ms 来做这次运算,当系统在第一个 16ms 时刷新界面,由于运算还没有结束,无法绘出图片。当系统隔 16ms 再发一次 VSYNC 信息重绘界面时,用户才会看到更新后的图片。也就是说 32ms 后才看到了这次刷新(并不是 24ms),这就是丢帧(dropped frame)。

丢帧给用户的感觉就是卡顿,而且如果运算过于复杂,丢帧会更多,导致界面常常处于停滞状态。

卡顿原因

过于复杂的布局

  • 界面性能取决于 UI 的渲染性能,UI 渲染的整个过程由 CPU 和 GPU 两个部分协同完成。CPU 负责 UI 布局元素的 Measure、Layout、Draw 等相关运算执行,GPU负责栅格化(rasterization),将 UI 元素绘制到屏幕上。
  • 如果 UI 布局层次太深,或是自定义控件的 onDraw 中有复杂运算,CPU 的相关运算就可能大于 16ms,导致卡顿。

过度绘制

UI 线程的复杂运算

  • UI 线程的复杂运算会造成 UI 无响应,导致 ANR,但更多的是造成 UI 响应停滞卡顿,ANR 是卡顿的极致。

频繁的 GC

优化方法

1、减少刷新次数

比如进度更新,要进度有变化再去刷新,且保证频率不得高于系统的刷新频率。

2、避免非必要的刷新

若控件不可见,则无需刷新。

3、避免后台线程影响

如列表控件,在滑动时不要去加载图片,可以在滑动监听里停止图片的加载。

4、局部刷新

如 RecyclerView 的 DiffUtil。自定义 View 可以使用下面两个方法:

invalidate(Rect dirty);
invalidate(int left, int top, int right, int bottom);

5、尽量使用属性动画,它减少了自身的重绘。最后要清除

StringBuilder,List 等在创建时传入一个合适的参数指定初始容量,以避免频繁扩容的开销。

6、开启硬件加速

7、原理可见 Android硬件加速原理与实现简介,理解Android硬件加速原理的小白文

Application 级别

<application android:hardwareAccelerated="true" />

Activity 级别

<activity android:hardwareAccelerated="true" />

Window 级别

getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

View 级别

// 如果是 software,会将 View 绘制到一个 Bitmap,
// 然后依然是通过硬件加速将 Bitmap 绘制到 Canvas
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  • LAYER_TYPE_NONE:普通渲染方式,不会返回一个离屏的缓冲,默认值。
  • LAYER_TYPE_HARDWARE:如果这个应用使用了硬件加速,这个 View 将会在硬件中渲染为 硬件纹理,如果应用程序并没有被硬件加速,则其效果和 LAYER_TYPE_SOFTWARE 相同。
  • LAYER_TYPE_SOFTWARE:此 View 通过软件渲染为一个 Bitmap。

检查是否开启了硬件加速

view.isHardware-Accelerated();
Canvas.isHardwareAccelerated();

如果 View 中要处理中文长文本,需要关闭硬件加速。因为每个中文编码不一样,缓存效果不理想。

监控

  1. 《Android 应用性能优化最佳实践》2.8 章,主要利用 MainLooper 里的 Printer。
  2. BlockCanary 开源库
  3. StrctMode

ANR

Activity 的 View:5 秒无响应
BroadcastReceiver:10 秒无响应
Service:20 秒无响应

ANR 时,系统会生成一个 traces.txt 的文件放在 /data/anr/ 下。通过 adb 命令将其导出到本地

$adb pull data/anr/traces.txt ~/Desktop

UI 线程做耗时操作,内存泄露导致内存不足都可能产生 ANR。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Android 优化之app启动优化的实现,包括了Android 优化之app启动优化的实现的使用技巧和注意事项,需要的朋友参考一下 App 启动方式 冷启动 App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等。在这个过程中,屏幕会显示一个空白的

  • 本文向大家介绍Android WebView 优化之路,包括了Android WebView 优化之路的使用技巧和注意事项,需要的朋友参考一下 随着app的迭代,嵌入的html5界面越来越多了,Webview这个强大组件引起的问题越发的多起来,例如: 1、WebView导致的oom问题 2、Android版本不同,采用了不同的内核,兼容性crash 3、不同版本实现不同,甚至URI不规范也会引起不

  • 本文向大家介绍总结Android App内存优化之图片优化,包括了总结Android App内存优化之图片优化的使用技巧和注意事项,需要的朋友参考一下 前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮、背景、动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片

  • 本文向大家介绍Mysql优化之Zabbix分区优化,包括了Mysql优化之Zabbix分区优化的使用技巧和注意事项,需要的朋友参考一下 使用zabbix最大的瓶颈在于数据库,维护好zabbix的数据存储,告警,就能很好地应用zabbix去构建监控系统。目前zabbix的数据主要存储在history和trends的2个表中,随着时间的推移,这两个表变得非常大,性能会非常差,影响监控的使用。对MySQ

  • 本文向大家介绍mysql性能优化之索引优化,包括了mysql性能优化之索引优化的使用技巧和注意事项,需要的朋友参考一下   作为免费又高效的数据库,mysql基本是首选。良好的安全连接,自带查询解析、sql语句优化,使用读写锁(细化到行)、事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多

  • 客户有个需求 要在浏览器中打印 1000 张纸张,但是预览的时候却发现浏览器无响应 打印纸张太多导致卡顿, 明确了 客户不会妥协...也就是必须得打 1000 张,请问从前端技术上有什么好的优化方案?