| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android Matrix之TraceCanary Wiki -> 正文阅读 |
|
[移动开发]Android Matrix之TraceCanary Wiki |
一.怎么衡量流程性1.帧率 FPS?游戏60FPS ,电影 FPS 25FPS ~ 30FPS,人眼 12FPS FPS 低并不意味着卡顿发生,而卡顿发生 FPS 一定不高。 2.掉帧程度可以更直观地衡量卡顿16ms,如果一帧的准备时间超出这个值,则认为发生掉帧,假设每帧准备时间约 32ms,每次只掉一帧,那么 1 秒内实际只刷新 30 帧,即平均帧率只有 30FPS,但这时往往不会觉得是卡顿。反而如果出现某次严重掉帧(>300ms),那么这一次的变化,通常很容易感知到。所以界面的掉帧程度,往往可以更直观的反映出卡顿。
?Activity 掉帧程度的分布情况及平均帧率 *? 相比单看平均帧率,掉帧程度的分布可以明显的看出,界面卡顿(平均帧率低)的原因是因为连续轻微的掉帧(下图1),还是某次严重掉帧造成的(下图2)。? ?再通过 Activity 区分不同场景,计算每个界面在有效绘制的时间片内,掉帧程度的分布情况及平均帧率,从而来评估出一个界面的整体流畅程度。? 二.原理1.Vsync,Choreographer 编舞者1.1?View 的绘制 View 的绘制会经过 Measure、Layout、Draw 这 3 个阶段,而这 3 个阶段的工作都是由 CPU 来负责完成。另外 CPU 还会负责一些用户输入、View 动画等事件,这部分工作都是在 UI 线程中完成。 当 CPU 绘制完成之后,会在 RederThread 线程中将这部分数据提交给 GPU。 最后手机屏幕再从这个 Buffer 中读取数据显示到屏幕上。实际上真正对 Buffer 中的数据进行合成显示到屏幕上的是 SurfaceFlinger。 1.2 Vsync 机制 screen refresh rate--屏幕刷新率。指的是手机屏幕每秒钟可以刷新多少次。目前在大多数的厂商手机上的屏幕刷新率是 60HZ,也就是以 16.6ms 进行一次刷新。 Android 系统引入了 Vsync 机制。每隔 16ms 硬件层发出 vsync 信号,应用层接收到此信号后会触发 UI 的渲染流程,同时 vsync 信号也会触发 SurfaceFlinger 读取 Buffer 中的数据,进行合成显示到屏幕上。简单来讲就是将上面 CPU 和 GPU 的开始时间与屏幕刷新强行拖拽到同一起跑线。实现下图效果: 1.3 Choreographer 编舞者
Choreographer 是一个承上启下的角色。 承上:接收应用层的各种 callback 输入,包括 input、animation、traversal 绘制。但是这些 callback 并不会被立即执行。而是会缓存在 Choreographer 中的 CallbackQueue 中。 启下:内部的 FrameDisplayEventReceiver 负责接收硬件层发成的 vsync 信号。当接收到 vsync 信号之后,会调用 onVsync 方法 -> doFrame -> doCallbacks,在 doCallbacks 中从 CallbackQueue 中取出进行绘制的 TraversalRunnable,并调用其 run 方法进行绘制。 通过这样一套机制,保证软件层和屏幕刷新处于同一频率,使 Android App 可以以一个比较稳定的帧率运行,减少因为频率波动造成“丢帧”的概率。 2.直接原因,主线程执行繁重的UI绘制、大量的计算或IO等耗时操作。BlockCanary、ArgusAPM、LogMonitor?包括Matrix主要思想是,监控主线程执行耗时,当超过阈值时,dump出当前主线程的执行堆栈,通过堆栈分析找到卡顿原因。 3.从监控主线程的实现原理上,主要分为两种:Looper,Choreographer3.1、依赖主线程 Looper,监控每次 dispatchMessage 的执行耗时。(BlockCanary)
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 0:17:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |