Matrix 原理与技巧总结 fps 篇

192 阅读2分钟

丢帧是如何计算的

public class FPSFrameCallback implements Choreographer.FrameCallback {

	fun doFrame(){
		这里需要一个阈值,并不是一直都需要上传的,koom根据 version 与 time 都做了限制,
		
		
		if(丢了20帧-->慢方法){
		
		}
		
		if(丢了30帧-->anr){// 
		
		}
		这种情况需要根据盒子的实际性能做检测,并不是一个固定数据
		//每次结束后再重新计算
		Choreographer.getInstance().postFrameCallback(this)
	}
}

使用方式

Choreographer.getInstance().postFrameCallback(new FPSFrameCallback())

加入的队列是 CALLBACK_ANIMATION 动画队列 现在这种方式颗粒度比较粗,统计的数据是间隔帧数据,如果想要更精细的如何处理

matrix 的做法

api>=24做法

OnFrameMetricsAvailableListener(Window  , FrameMetrics  )

FrameMetrics 就可以获取全部想要的信息,但是需要api 24

低版本api做法

概念

概念一:fps 是根据 Choreographer 来计算的,在doFrame 中遍历 Choreographer 中的callback input anim add_anim draw commit 5个事件队列都做完了,算作一帧,想要计算那个事件处理的比较慢 可以向队列中插入Runnable 来获取各个链表的执行时间

概念二:callback 结构 --> 数组,数组中的每个元素是一个队列,可以加入到头部,也可以加入到尾部 , 这个队列所有callback 执行完成后,do while() 清空队列,所以不能只添加一次,每一帧都要添加

概念三:fps 是如何刷新的 --> 垂直同步信号来临的时候,通过FrameHandler 将消息发送出去,执行这一帧的事件,可以将 fps 事件看做是一次消息的处理

第一步:通过反射向Choreographer 的 callback0 的头部插入一个 Runnable ,

第二步:在 垂直同步信号来临遍历 callback[0] 的队列时,首先遍历的就是 我们插入的 Runnable ,那么此次是帧开始 ,也是 input 事件的开始,向 callback[1] 动画队列头部插入一条数据 ,向 callback[3] draw 队列头部插入一条数据, 当 callback[1] 执行时,此时是 input end ,也是 anim start , callabck[3] 也是同理

第三步:在第一步执行的同时,根据概念三 ,由于监听了looper.printer ,那么就将当前处理的消息标记为 帧消息 ,在消息结束的时候,callback[3]结束,帧计算结束 ,根据概念二 同时执行第一步

如果你不了解 Choreographer ,可以移步我的简书编舞者的艺术 来看看他执行的原理,

了解了上面的内容,就可以非常轻松地看懂 Matrix 的 FrameTracer 的源码了