zoukankan      html  css  js  c++  java
  • 掉帧的场景

    内部FrameBeat类实现了Choreographer.FrameCallback,可以感知每一帧的绘制时间。通过前后两帧的时间差判断是否有慢函数发生。

    @Override
    public void doFrame(long lastFrameNanos, long frameNanos) {
    if (isIgnoreFrame) {
    mActivityCreatedInfoMap.clear();
    setIgnoreFrame(false);
    getMethodBeat().resetIndex();
    return;
    }

    int index = getMethodBeat().getCurIndex();
    //判断是否有慢函数
    if (hasEntered && frameNanos - lastFrameNanos > mTraceConfig.getEvilThresholdNano()) {
    MatrixLog.e(TAG, "[doFrame] dropped frame too much! lastIndex:%s index:%s", 0, index);
    handleBuffer(Type.NORMAL, 0, index - 1, getMethodBeat().getBuffer(), (frameNanos - lastFrameNanos) / Constants.TIME_MILLIS_TO_NANO);
    }
    getMethodBeat().resetIndex();
    mLazyScheduler.cancel();
    mLazyScheduler.setUp(this, false);

    }
    复制代码
    主线程长时间阻塞UI绘制的场景
    LazyScheduler内有一个HandlerThread,调用LazyScheduler.setup方法会向这个HandlerThread的MQ发送一个延时5s的消息。若没有发生类似ANR的场景,在每一帧的doFrame回调中取消这个消息,同时发送一个新的延时5s的消息(正常情况下消息是得不到执行的);若发生类似ANR的情况,doFrame没有被回调,这个延时5s的消息得到执行,将回调到onTimeExpire方法

    @Override
    public void onTimeExpire() {
    // maybe ANR
    if (isBackground()) {
    MatrixLog.w(TAG, "[onTimeExpire] pass this time, on Background!");
    return;
    }
    long happenedAnrTime = getMethodBeat().getCurrentDiffTime();
    MatrixLog.w(TAG, "[onTimeExpire] maybe ANR!");
    setIgnoreFrame(true);
    getMethodBeat(http://www.my516.com).lockBuffer(false);
    //有慢函数
    handleBuffer(Type.ANR, 0, getMethodBeat().getCurIndex() - 1, getMethodBeat().getBuffer(), null, Constants.DEFAULT_ANR, happenedAnrTime, -1);
    }

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11295909.html
Copyright © 2011-2022 走看看