您当前的位置: 首页 >  面试
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试:如何侦测应用的帧率FPS

沙漠一只雕得儿得儿 发布时间:2021-12-16 12:32:48 ,浏览量:0

有两种常用方式
  • 360 ArgusAPM类实现方式: 监测Choreographer两次Vsync时间差
  • BlockCanary的实现方式:监测UI线程单条Message执行时间
方案一:使用Choreographer的VSYNC回调

依赖Choreographer VSYNC回调,具体实现如下:循环添加Choreographer.FrameCallback

Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {

	@Override
	    public void doFrame(long frameTimeNanos) {
	        mFpsCount++;
	        mFrameTimeNanos = frameTimeNanos;
	        if (isCanWork()) {
	            //注册下一帧回调
	            Choreographer.getInstance().postFrameCallback(this);
	        } else {
	            mCurrentCount = 0;
	        }
	    }
});

这种监听有个问题就是,监听过于频繁,因为在无需界面刷新的时候Choreographer.FrameCallback还是不断循环执行,浪费CPU资源,对线上运行采集并不友好,相比之下BlockCanary的监听单个Message执行要友善的多,而且同样能够涵盖UI绘制耗时、两帧之间的耗时,额外执行负担较低

方案二:监控单条Message的执行时间

为Looper设置一个LooperPrinter,根据回传信息头区分消息执行开始于结束,计算Message耗时:原理如下

	      public static void loop() {
	            ...
	            if (logging != null) {
	                logging.println(">>>>> Dispatching to " + msg.target + " " +
	                        msg.callback + ": " + msg.what);
	            }
	             ...
	            if (logging != null) {
	                logging.println("            
关注
打赏
1657159701
查看更多评论
0.0403s