有两种常用方式

  • 360 ArgusAPM类实现方式: 监测Choreographer两次Vsync时间差
  • BlockCanary的实现方式:监测UI线程单条Message执行时间

方案一:使用Choreographer的VSYNC回调

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

Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {@Overridepublic 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("<<<<< Finished to " + msg.target + " "+msg.callback);}

自定义LooperPrinter如下:

     class LooperPrinter implements Printer {@Overridepublic void println(String x) {...if (isValid) {<!--区分开始结束,计算消息耗时-->dispatch(x.charAt(0) == '>', x);}

利用回调参数">>>>"与"<<<"的 区别即可诊断出Message执行耗时,从而确定是否导致掉帧。以上实现针对所有UI Message,原则上UI线程所有的消息都应该保持轻量级,任何消息超时都应当算作异常行为,所以,直接拿来做掉帧监测没特大问题的。

但是,有些特殊情况可能对FPS计算有一些误判,比如,在touch时间里往UI线程塞了很多消息,单条一般不会影响滚动,但多条聚合可能会带来影响,如果没跳消息执行时间很短,这种方式就可能统计不到,当然这种业务的写法本身就存在问题,所以先不考虑这种场景。

面试:如何侦测应用的帧率FPS相关推荐

  1. opengl计算帧率_unity如何计算帧率FPS

    在使用unity开发过程中,许多时候需要显示当前项目的帧率FPS,用于观察项目的流程度,那么如何计算FPS呢?请看下面代码演示: public class FPSShow:MonoBehaviour ...

  2. 帧率(FPS)计算的六种方法总结

    帧率(FPS)计算是游戏编程中常见的一个话题.大体来说,总共有如下六种方法: 一.固定时间帧数法 帧率计算的公式为: fps = frameNum / elapsedTime; 如果记录固定时间内的帧 ...

  3. 帧率(FPS)计算的几种方法总结

    帧率(FPS, frame per second)计算是游戏编程中常见的一个话题,因为表现在画面刷新与视觉感官上,所以相对而言,帧率非常影响用户体验.这也是很多大型3D游戏所要提升的重要点,意味着你要 ...

  4. 【使用opencv方法计算帧率fps】

    getTickCount() 返回从操作系统启动到目前为止所经过的记时周期数 也就是当前的Tick的数量. getTickFrequency() 返回CPU的频率. 计算耗时 t1 = getTick ...

  5. 关于渲染帧率(FPS)的问题

    先列举几个关于渲染帧率的文章: 1. http://ruinerlee.blog.163.com/blog/static/215611167201292990203/ 2. http://blog.c ...

  6. Unity3D-计算帧率FPS

    网上有很多计算FPS的方法,一般计算没有达到百分之百准确的帧率,只有更接近实际帧率的计算方式. 下面是本人测试多种方法之后觉得比较接近实际帧率的计算方式. public class FPS : Mon ...

  7. OpenCV~捕获摄像头 帧率fps和waitkey函数 问题

    本文分析在使用OpenCV捕获摄像头时发现的两个问题: 使用capture.get(CV_CAP_PROP_FPS)方法获取帧率为0! waitKey()函数有几个作用?改变它的参数大小会影响计算得到 ...

  8. 浏览器帧率(fps)对比:QQ,Firefox,Chrome,Edge

    笔者使用QQ浏览器频率较高,因此经常会对网页滑动较低的帧率敏感:同时使用的Edge则十分丝滑,为了探究浏览器帧率并试图使浏览器平滑滚动,特做以下测试. 浏览器种类丰富,各有各的优点所在,本文以浏览器运 ...

  9. 视频质量和大小-分辨率200*200、码率kb/s、帧率FPS,带宽 / 码流 / 人数

    几个对视频的质量和大小影响最大的参数:帧率.码率和分辨率. public static final int DEFAULT_VIDEO_WIDTH = 640; public static final ...

最新文章

  1. Eclipse Tomcat的一些基本配置
  2. 图像处理之快速均值模糊(Box Blur)
  3. androidannotations
  4. kali下fcrackzip使用
  5. GDCM:gdcm::IOD的测试程序
  6. CSS布局——display,position,float属性
  7. IOS开发笔记之十七——一个关于工程目录读写权限的问题
  8. 【祈福】一句话让你的网页为灾区祈福(让网页变灰色)
  9. myeclipse中删除tomcat 的server后,重新添加进来的方法
  10. DirectX诊断工具怎么打开?怎么查看当前电脑所支持的DirectX版本?
  11. 彻底解决Python包下载慢问题
  12. GCN与图谱理论(三):图的谱分析与图傅里叶变换
  13. hdu 1862 hdoj 1862
  14. c语言程序设计景点售票系统,c语言售票系统.docx
  15. 扫拖地机器人预留_进阶规划,扫拖一体,小瓦扫地机器人规划版重度体验
  16. 万年历,阴阳历转换。
  17. To invoke and to begin invoke, that is a question.
  18. 程序员对老板说:老子,明天不上班!结果...
  19. 用心行走——《做最好的新教师》读后感3200字
  20. rknn3399pro 2小时入门指南(八)详细教程指导你一步到位训练得到yolov3 rknn模型

热门文章

  1. ubuntu16.04安装vmware后集成显卡如何开启3D加速的问题解决思路
  2. 大数据技术第三章-分布式文件系统HDFS
  3. Nucleus PLUS
  4. 计算机公共机房云平台方案,公共技能云机房建设方案设计及配置应用清单
  5. 日常——异步Socket实现中的问题
  6. Android 13正式发布,谷歌I/O大会你不得不知的4大看点
  7. Thinkpad E431 加固态硬盘
  8. 怎样打造U盘的个性化图标
  9. 菜鸟学习nodejs--安装nodejs
  10. 微信小程序-路线规划,地图导航功能基于高德地图API