diff options
-rw-r--r-- | libs/hwui/JankTracker.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp index 4b0ddd2fa2ef..c5c2d159bf03 100644 --- a/libs/hwui/JankTracker.cpp +++ b/libs/hwui/JankTracker.cpp @@ -206,6 +206,7 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo frame.set(FrameInfoIndex::FrameDeadline) = deadline; } + bool computeNextFrameStartUnstuffed = false; // If we hit the deadline, cool! if (frame[FrameInfoIndex::GpuCompleted] < deadline) { if (isTripleBuffered) { @@ -213,7 +214,8 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo (*mGlobalData)->reportJankType(JankType::kHighInputLatency); // Buffer stuffing state gets carried over to next frame, unless there is a "pause" - mNextFrameStartUnstuffed += frameInterval; + // Instead of increase by frameInterval, recompute to catch up the drifting vsync + computeNextFrameStartUnstuffed = true; } } else { mData->reportJankType(JankType::kMissedDeadline); @@ -222,14 +224,7 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo (*mGlobalData)->reportJank(); // Janked, store the adjust deadline to detect triple buffering in next frame correctly. - nsecs_t jitterNanos = frame[FrameInfoIndex::GpuCompleted] - - frame[FrameInfoIndex::Vsync]; - nsecs_t lastFrameOffset = jitterNanos % frameInterval; - - // Note the time when the next frame would start in an unstuffed situation. If it starts - // earlier, we are in a stuffed situation. - mNextFrameStartUnstuffed = frame[FrameInfoIndex::GpuCompleted] - - lastFrameOffset + frameInterval; + computeNextFrameStartUnstuffed = true; recomputeThresholds(frameInterval); for (auto& comparison : COMPARISONS) { @@ -254,6 +249,16 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo } } + if (computeNextFrameStartUnstuffed) { + nsecs_t jitterNanos = frame[FrameInfoIndex::GpuCompleted] - frame[FrameInfoIndex::Vsync]; + nsecs_t lastFrameOffset = jitterNanos % frameInterval; + + // Note the time when the next frame would start in an unstuffed situation. If it starts + // earlier, we are in a stuffed situation. + mNextFrameStartUnstuffed = + frame[FrameInfoIndex::GpuCompleted] - lastFrameOffset + frameInterval; + } + int64_t totalGPUDrawTime = frame.gpuDrawTime(); if (totalGPUDrawTime >= 0) { mData->reportGPUFrame(totalGPUDrawTime); |