Android性能之 您所在的位置:网站首页 在线帧率检测 Android性能之

Android性能之

#Android性能之| 来源: 网络整理| 查看: 265

Android性能之——帧率检测

本文我们来学习如何实现帧率的检测。

为什么要检测帧率

Android在设计的时候,把帧频限定在了每秒60帧,当我们的APP的帧频60fps时,画面就会非常的流程。但是通常由于各种各样的原因,帧频很可能会小于60fps,这样就会出现丢帧现象,用户端表现为可感知的卡顿等现象。那面我们的帧频可以高于60fps吗,答案是否定的,这是因为界面刷新渲染依赖底层的VSYNC信号,VSYNC信号以每秒60次的频率发送给上层,并且高于60fps的帧频也是没有必要的,因为人眼与大脑之间的协作无法感知超过60fps的画面更新。

12fps大概类似手动快速翻动书籍的帧率,这明显是可以感知到不够顺滑的。24fps使得人眼感知的是连续线性的运动,这其实是归功于运动模糊的效果。24fps是电影胶圈通常使用的帧率,因为这个帧率已经足够支撑大部分电影画面需要表达的内容,同时能够最大的减少费用支出。但是低于30fps是无法顺畅表现绚丽的画面内容的,此时就需要用到60fps来达到想要的效果,当然超过60fps是没有必要的。

开发app的性能目标就是保持60fps,这意味着每一帧你只有16ms=1000/60的时间来处理所有的任务。

我们如何来获得应用的帧率呢?线下环境我们可以使用Systrace等工具来进行分析,或者也可以使用GPU呈现模式分析来检测丢帧卡顿等问题。现在,如果我们想要监控线上用户的在使用过程中,是否卡顿丢帧,想要知道APP真实环境的帧率是多少?如何来做呢?

线上帧率监控实现

想要实现线上用户的帧率监控,我们可以通过 Choreographer.FrameCallback 回调来实现帧率监控。

关于 Choreographer 的实现原理,请参考《从源码分析Choreographer是如何实现VSYNC信号的请求及帧的刷新处理?》。

package com.budaye.simpledemo; import android.util.Log; import android.view.Choreographer; /** * @ProjectName: SimpleDemo * @Desc: * @Author: buyuntao * @Date: 2020/11/11 */ public class FpsTest implements Choreographer.FrameCallback { private long mLastFrameTimeNanos = 0; //最后一次时间 private long mFrameTimeNanos = 0; //本次的当前时间 private int mFpsCount = 0; public void startFps() { mLastFrameTimeNanos = System.nanoTime(); Choreographer.getInstance().postFrameCallback(this); AsyncThreadTask.executeDelayed(runnable, 1000); } //定时任务 private Runnable runnable = new Runnable() { @Override public void run() { calculateFPS(); AsyncThreadTask.executeDelayed(runnable, 1000); } }; private void calculateFPS() { if (mLastFrameTimeNanos == 0) { mLastFrameTimeNanos = mFrameTimeNanos; return; } float costTime = (float) (mFrameTimeNanos - mLastFrameTimeNanos) / 1000000000.0F;//纳秒转成毫秒。 if (mFpsCount


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有