import android.util.Log; import android.view.Choreographer; /** * Created by sensetime on 18-4-25. */ public class SMFrameCallback implements Choreographer.FrameCallback { public static SMFrameCallback sInstance; private String TAG = "SMFrameCallback"; public static final float deviceRefreshRateMs = 16.6f; public static long lastFrameTimeNanos = 0;//Nanoseconds public static long currentFrameTimeNanos = 0; public void start() { Choreographer.getInstance().postFrameCallback(SMFrameCallback.getInstance()); } public static SMFrameCallback getInstance() { if (sInstance == null) { sInstance = new SMFrameCallback(); } return sInstance; } @Override public void doFrame(long frameTimeNanos) { if (lastFrameTimeNanos == 0) { lastFrameTimeNanos = frameTimeNanos; Choreographer.getInstance().postFrameCallback(this); return; } currentFrameTimeNanos = frameTimeNanos; float value = (currentFrameTimeNanos - lastFrameTimeNanos) / 1000000.0f; final int skipFrameCount = skipFrameCount(lastFrameTimeNanos, currentFrameTimeNanos, deviceRefreshRateMs); Log.e(TAG, "Drawing time interval value=" + value + " frameTimeNanos=" + frameTimeNanos + " currentFrameTimeNanos=" + currentFrameTimeNanos + " skipFrameCount=" + skipFrameCount + ""); lastFrameTimeNanos = currentFrameTimeNanos; Choreographer.getInstance().postFrameCallback(this); } /** * * Calculate how many frames to skip * @param start * @param end * @param devicefreshRate * @return */ private int skipFrameCount(long start, long end, float devicefreshRate) { int count = 0; long diffNs = end - start; long diffMs = Math.round(diffNs / 1000000.0f); long dev = Math.round(devicefreshRate); if (diffMs > dev) { long skipCount = diffMs / dev; count = (int) skipCount; } return count; } }Reference: https://www.jianshu.com/p/777fe2f71039
Detect app draw time
Guess you like
Origin http://43.154.161.224:23101/article/api/json?id=324885020&siteId=291194637
Recommended
Ranking