Activity 帧率监控打印

public class FPSSystemLog {

    private static final String TAG = FPSSystemLog.class.getName();

    private volatile static FPSSystemLog sINSTANCE = null;

    // double check
    public static FPSSystemLog getInstance() {
        if (sINSTANCE == null) {
            synchronized (FPSSystemLog.class) {
                if (sINSTANCE == null) {
                    // volatile keyword makes this line return a real non-null object
                    sINSTANCE = new FPSSystemLog();
                }
            }
        }
        return sINSTANCE;
    }

    private boolean closed = false;
    private Activity mActivity;

    // Variables to track frames per second, enabled via DEBUG_FPS flag
    private long mFpsStartTime = -1;
    private long mFpsPrevTime = -1;
    private int mFpsNumFrames;

    public void open(Activity activity) {
        closed = false;
        mActivity = activity;
        Choreographer.getInstance().postFrameCallback(mCallback);
    }

    public void close(Activity activity) {
        closed = true;
        mActivity = activity;
        Choreographer.getInstance().removeFrameCallback(mCallback);
    }

    private Choreographer.FrameCallback mCallback = new Choreographer.FrameCallback() {
        @Override
        public void doFrame(long frameTimeNanos) {
            if (!closed) {
                Choreographer.getInstance().postFrameCallback(this);
                trackFPS();
            }
        }
    };

    private void trackFPS() {
        // Tracks frames per second drawn. First value in a series of draws may be bogus
        // because it down not account for the intervening idle time
        long nowTime = System.currentTimeMillis();
        if (mFpsStartTime < 0) {
            mFpsStartTime = mFpsPrevTime = nowTime;
            mFpsNumFrames = 0;
        } else {
            ++mFpsNumFrames;
//            String thisHash = Integer.toHexString(System.identityHashCode(this));
            String activity = mActivity.getClass().getName();
            long frameTime = nowTime - mFpsPrevTime;
            long totalTime = nowTime - mFpsStartTime;
            Log.v(TAG, "" + activity + "\tFrame time:\t" + frameTime);
            mFpsPrevTime = nowTime;
            if (totalTime > 1000) {
                float fps = (float) mFpsNumFrames * 1000 / totalTime;
                Log.v(TAG, "" + activity + "\tFPS:\t" + fps);
                mFpsStartTime = nowTime;
                mFpsNumFrames = 0;
            }
        }
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。