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() {
    ...
    //数据分析逻辑可行阅读
    }

  • 相关阅读:
    iOS:网络检测
    WinJS:设置listView垂直滚动
    iOS:在AppDelegate中定义managed object context
    简笔画项目总结: ios绘图机制 & 实现记录笔迹功能
    CSS基础
    DOM小结
    iOS:view.frame
    WP:初探
    iOS:UIWebView scrollView 的分页滑动问题
    Mono for Android: 利用mono for android开发的第一个程序
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11295902.html
Copyright © 2011-2022 走看看