Count the overall number of missed frames

A frame might be missed in both app and SF so adding a separate counter
to keep track of the overall number.

Test: manual
Bug: 185897790

Change-Id: I0ed4e0dc4ef949f40ba612b68860a2da3d0e7e91
This commit is contained in:
Marcin Oczeretko
2021-04-28 16:52:34 +01:00
parent 4656cb0260
commit a7e3943e50

View File

@@ -394,8 +394,9 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
int totalFramesCount = 0;
long maxFrameTimeNanos = 0;
int missedFramesCount = 0;
int missedAppFramesCount = 0;
int missedSfFramesCounts = 0;
int missedSfFramesCount = 0;
for (int i = 0; i <= indexOnOrAfterEnd; i++) {
JankInfo info = mJankInfos.valueAt(i);
@@ -404,17 +405,23 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
}
if (info.surfaceControlCallbackFired) {
totalFramesCount++;
boolean missedFrame = false;
if ((info.jankType & PREDICTION_ERROR) != 0
|| ((info.jankType & JANK_APP_DEADLINE_MISSED) != 0)) {
Log.w(TAG, "Missed App frame:" + info.jankType);
missedAppFramesCount++;
missedFrame = true;
}
if ((info.jankType & DISPLAY_HAL) != 0
|| (info.jankType & JANK_SURFACEFLINGER_DEADLINE_MISSED) != 0
|| (info.jankType & JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED) != 0
|| (info.jankType & SURFACE_FLINGER_SCHEDULING) != 0) {
Log.w(TAG, "Missed SF frame:" + info.jankType);
missedSfFramesCounts++;
missedSfFramesCount++;
missedFrame = true;
}
if (missedFrame) {
missedFramesCount++;
}
// TODO (b/174755489): Early latch currently gets fired way too often, so we have
// to ignore it for now.
@@ -431,10 +438,12 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
}
// Log the frame stats as counters to make them easily accessible in traces.
Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#missedFrames",
missedFramesCount);
Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#missedAppFrames",
missedAppFramesCount);
Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#missedSfFrames",
missedSfFramesCounts);
missedSfFramesCount);
Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#totalFrames",
totalFramesCount);
Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#maxFrameTimeMillis",
@@ -442,7 +451,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
// Trigger perfetto if necessary.
boolean overMissedFramesThreshold = mTraceThresholdMissedFrames != -1
&& missedAppFramesCount + missedSfFramesCounts >= mTraceThresholdMissedFrames;
&& missedFramesCount >= mTraceThresholdMissedFrames;
boolean overFrameTimeThreshold = mTraceThresholdFrameTimeMillis != -1
&& maxFrameTimeNanos >= mTraceThresholdFrameTimeMillis * NANOS_IN_MILLISECOND;
if (overMissedFramesThreshold || overFrameTimeThreshold) {
@@ -453,9 +462,10 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
FrameworkStatsLog.UI_INTERACTION_FRAME_INFO_REPORTED,
mSession.getStatsdInteractionType(),
totalFramesCount,
missedAppFramesCount + missedSfFramesCounts,
missedFramesCount,
maxFrameTimeNanos,
missedSfFramesCounts);
missedSfFramesCount,
missedAppFramesCount);
if (mListener != null) {
mListener.onCujEvents(mSession, ACTION_METRICS_LOGGED);
}
@@ -465,7 +475,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
+ " (" + mBeginVsyncId + "," + mEndVsyncId + ")"
+ " totalFrames=" + totalFramesCount
+ " missedAppFrames=" + missedAppFramesCount
+ " missedSfFrames=" + missedSfFramesCounts
+ " missedSfFrames=" + missedSfFramesCount
+ " missedFrames=" + missedFramesCount
+ " maxFrameTimeMillis=" + maxFrameTimeNanos / NANOS_IN_MILLISECOND);
}
}