面试:如何侦测应用的帧率FPS
有两种常用方式
- 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相关推荐
- opengl计算帧率_unity如何计算帧率FPS
在使用unity开发过程中,许多时候需要显示当前项目的帧率FPS,用于观察项目的流程度,那么如何计算FPS呢?请看下面代码演示: public class FPSShow:MonoBehaviour ...
- 帧率(FPS)计算的六种方法总结
帧率(FPS)计算是游戏编程中常见的一个话题.大体来说,总共有如下六种方法: 一.固定时间帧数法 帧率计算的公式为: fps = frameNum / elapsedTime; 如果记录固定时间内的帧 ...
- 帧率(FPS)计算的几种方法总结
帧率(FPS, frame per second)计算是游戏编程中常见的一个话题,因为表现在画面刷新与视觉感官上,所以相对而言,帧率非常影响用户体验.这也是很多大型3D游戏所要提升的重要点,意味着你要 ...
- 【使用opencv方法计算帧率fps】
getTickCount() 返回从操作系统启动到目前为止所经过的记时周期数 也就是当前的Tick的数量. getTickFrequency() 返回CPU的频率. 计算耗时 t1 = getTick ...
- 关于渲染帧率(FPS)的问题
先列举几个关于渲染帧率的文章: 1. http://ruinerlee.blog.163.com/blog/static/215611167201292990203/ 2. http://blog.c ...
- Unity3D-计算帧率FPS
网上有很多计算FPS的方法,一般计算没有达到百分之百准确的帧率,只有更接近实际帧率的计算方式. 下面是本人测试多种方法之后觉得比较接近实际帧率的计算方式. public class FPS : Mon ...
- OpenCV~捕获摄像头 帧率fps和waitkey函数 问题
本文分析在使用OpenCV捕获摄像头时发现的两个问题: 使用capture.get(CV_CAP_PROP_FPS)方法获取帧率为0! waitKey()函数有几个作用?改变它的参数大小会影响计算得到 ...
- 浏览器帧率(fps)对比:QQ,Firefox,Chrome,Edge
笔者使用QQ浏览器频率较高,因此经常会对网页滑动较低的帧率敏感:同时使用的Edge则十分丝滑,为了探究浏览器帧率并试图使浏览器平滑滚动,特做以下测试. 浏览器种类丰富,各有各的优点所在,本文以浏览器运 ...
- 视频质量和大小-分辨率200*200、码率kb/s、帧率FPS,带宽 / 码流 / 人数
几个对视频的质量和大小影响最大的参数:帧率.码率和分辨率. public static final int DEFAULT_VIDEO_WIDTH = 640; public static final ...
最新文章
- Eclipse Tomcat的一些基本配置
- 图像处理之快速均值模糊(Box Blur)
- androidannotations
- kali下fcrackzip使用
- GDCM:gdcm::IOD的测试程序
- CSS布局——display,position,float属性
- IOS开发笔记之十七——一个关于工程目录读写权限的问题
- 【祈福】一句话让你的网页为灾区祈福(让网页变灰色)
- myeclipse中删除tomcat 的server后,重新添加进来的方法
- DirectX诊断工具怎么打开?怎么查看当前电脑所支持的DirectX版本?
- 彻底解决Python包下载慢问题
- GCN与图谱理论(三):图的谱分析与图傅里叶变换
- hdu 1862 hdoj 1862
- c语言程序设计景点售票系统,c语言售票系统.docx
- 扫拖地机器人预留_进阶规划,扫拖一体,小瓦扫地机器人规划版重度体验
- 万年历,阴阳历转换。
- To invoke and to begin invoke, that is a question.
- 程序员对老板说:老子,明天不上班!结果...
- 用心行走——《做最好的新教师》读后感3200字
- rknn3399pro 2小时入门指南(八)详细教程指导你一步到位训练得到yolov3 rknn模型