zoukankan      html  css  js  c++  java
  • FPS检测

    目的:检测绘制过程中的FPS数量。

    获取DectorView的ViewTreeObserver,感知UI绘制的开始

    private void addDrawListener(final Activity activity) {
    activity.getWindow().getDecorView().post(new Runnable() {
    @Override
    public void run() {
    activity.getWindow().getDecorView().getViewTreeObserver().removeOnDrawListener(FPSTracer.this);
    activity.getWindow().getDecorView().getViewTreeObserver().addOnDrawListener(FPSTracer.this);
    }
    });
    }

    @Override
    public void onDraw() {
    isDrawing = true;
    }

    复制代码
    通过Choreographer.FrameCallback,感知UI绘制的结束

    @Override
    public void doFrame(long lastFrameNanos, long frameNanos) {
    if (!isInvalid && isDrawing && isEnterAnimationComplete() && mTraceConfig.isTargetScene(getScene())) {
    handleDoFrame(lastFrameNanos, frameNanos, getScene());
    }
    isDrawing = false;
    }
    复制代码
    理论上用户更关心的是绘制过程中FPS过低导致的卡顿(UI静止的情况下,用户是感知不到FPS低的)

    在doFrame方法中,记录每一帧的数据,其中scene这个字段标识一个页面

    @Override
    public void onChange(final Activity activity, final Fragment fragment) {
    this.mScene = TraceConfig.getSceneForString(activity, fragment);
    }
    复制代码
    onChange的默认实现是通过Application的ActivityLifecycleCallbacks回调感知Activity的变化

    @Override
    public void onActivityResumed(final Activity activity) {
    ...
    if (!activityHash.equals(mCurActivityHash)) {
    for (IObserver listener : mObservers) {
    listener.onChange(activity, null);
    }
    mCurActivityHash = activityHash;
    }
    ...
    }

    复制代码
    FPS数据默认是2分钟分析一次(前台情况下),切后台时后台轮询线程停止。


    /**
    * report FPS
    */
    private void doReport() {
    ...
    //数据分析逻辑可行阅读
    }

  • 相关阅读:
    不能在注册表中识别出来python时的解决方法
    Biopython
    Biopython
    生信相关网站
    linux下的查找命令
    class
    不同版本的Eclipse安装SVN插件
    【如何快速的开发一个完整的iOS直播app】(原理篇)
    iOS 直播
    Ios-视频直播-知识点汇总-持续更新
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11295902.html
Copyright © 2011-2022 走看看