文章目录
- 一、从XML到屏幕上的展示
- 造成跳帧的因素有那些
- 发现问题
- 定位问题
- 定位代码
 
一、从XML到屏幕上的展示

-  数据加载阶段 
-  数据控制阶段 
-  数据展示阶段 
 xml —> view
 onCreat —> 解析layout.xml
 resume —> view —> wms
 ViewRootImpl
 UI 绘制流程 :测量 —> 布局 —> 绘制
 处理数据(CPU业务数据范围)
Android当中数据的生产依托两个硬件 :CPU/GPU
 CPU处理的最常规的代码调用(指令),比如IO/线程/对象的分配
 GPU处理图像数据的生成(算术)
Canvas是作为当前Android中的图像生产者
 canvas.draw —> native —> C++ —> skia/opengl —> GPU的调用处理
Android Surface —> Java 画面的宽度 - 外框数据
 Surface —> native canvas产生的图像数据是保存在底层的这个里面
canvas.draw
native这里给了一个队列空间,里面的空间是给Surface 使用
SurfaceFilnger Android真正和硬件沟通(调用驱动代码),给硬件(屏幕)提供数据
数据交给屏幕 —> 显示
FrameBuffer 帧缓冲区(驱动提供的一个容器)
设备性能因素问题
- CPU/GPU(制图速度)
 1秒钟可以生成多少张图像数据
 FPS —> 帧率
- 屏幕(刷新率)
 1秒钟能支撑多少次的图像变更
Android肯定不能放任随便推数据或者更新数据
 需要节奏
 vsync =垂直同步信号
 1次刷新帧缓冲区的时机
 SF —> 按自己的节奏去固定更新帧缓冲区
 1秒 60帧的节奏刷新
 1秒 = 1000ms
 1000/60 = 16.66ms
 SF —> 16.66ms启动一次帧缓冲区刷新
固定在刷新前判断图像数据是否准备好 —> 推送刷新
编舞者 - Choreographer 控制节奏
 SurfaceFilnger 在发送垂直同步信号时不会去管其他人的因素
16.66ms节点,同时数据准备完成,刷新数据,没到16.66ms节点和过了节点都不更新
 
 卡顿就是跳帧造成的
 16ms主要处理两件事
- 将UI对象转换成多边形和纹理
- CPU传递数据到GPU,GPU进行绘制
造成跳帧的因素有那些
常规因素:
 层级
 过度绘制问题
 写代码所造成的问题——卡顿原因不大
核心因素
- 内存引起的
- 线程引起的
STW停顿时间 Stop The World 停止所有工作线程,清理内存
 等待时间片段
 IO阻塞时间
 锁阻塞时间
卡顿的本质是因为错过了垂直同步信号的时间
影响
- 常规影响
 层级以及过度绘制导致
- 内存影响
 STW现象导致(时间或是定义view的绘制时,new对象)
- 线程影响
 阻塞当前主线程的代码都会造成卡顿
发现问题
IT基础:内存管理,线程管理,网络,算法
 android: 通信机制+andorid内部支撑他运作的多个进程之间的写作问题
定位问题
systrace : 找事故原因
 大面积呈现状态:
 大面积绿色:代码的时机运行时间确实超过了
 层级多,代码里面写了耗时的,绘制出问题了
 大面积紫色:代码里面有高频生产对象的代码(事件、draw)
 大面积灰色:有锁的问题
 大面积蓝色:系统资源不够
 大面积橙色:有IO问题出现
定位代码
blockcannary
制图速度高于刷新速度就会出现
 制图速度跟不上刷新速度