Merge "Detect doubleStuffed frame when duration is over 2*interval" into tm-qpr-dev

This commit is contained in:
Dake Gu
2022-06-07 17:22:10 +00:00
committed by Android (Google) Code Review
2 changed files with 68 additions and 2 deletions

View File

@@ -201,8 +201,9 @@ void JankTracker::finishFrame(FrameInfo& frame, std::unique_ptr<FrameMetricsRepo
// If we are in triple buffering, we have enough buffers in queue to sustain a single frame
// drop without jank, so adjust the frame interval to the deadline.
if (isTripleBuffered) {
deadline += frameInterval;
frame.set(FrameInfoIndex::FrameDeadline) += frameInterval;
int64_t originalDeadlineDuration = deadline - frame[FrameInfoIndex::IntendedVsync];
deadline = mNextFrameStartUnstuffed + originalDeadlineDuration;
frame.set(FrameInfoIndex::FrameDeadline) = deadline;
}
// If we hit the deadline, cool!

View File

@@ -195,3 +195,68 @@ TEST(JankTracker, doubleStuffedThenPauseThenJank) {
ASSERT_EQ(3, container.get()->totalFrameCount());
ASSERT_EQ(2, container.get()->jankFrameCount());
}
TEST(JankTracker, doubleStuffedTwoIntervalBehind) {
std::mutex mutex;
ProfileDataContainer container(mutex);
JankTracker jankTracker(&container);
std::unique_ptr<FrameMetricsReporter> reporter = std::make_unique<FrameMetricsReporter>();
uint64_t frameNumber = 0;
uint32_t surfaceId = 0;
// First frame janks
FrameInfo* info = jankTracker.startFrame();
info->set(FrameInfoIndex::IntendedVsync) = 100_ms;
info->set(FrameInfoIndex::Vsync) = 101_ms;
info->set(FrameInfoIndex::SwapBuffersCompleted) = 107_ms;
info->set(FrameInfoIndex::GpuCompleted) = 117_ms;
info->set(FrameInfoIndex::FrameCompleted) = 117_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 116_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->jankFrameCount());
// Second frame is long, but doesn't jank because double-stuffed.
// Second frame duration is between 1*interval ~ 2*interval
info = jankTracker.startFrame();
info->set(FrameInfoIndex::IntendedVsync) = 116_ms;
info->set(FrameInfoIndex::Vsync) = 116_ms;
info->set(FrameInfoIndex::SwapBuffersCompleted) = 129_ms;
info->set(FrameInfoIndex::GpuCompleted) = 133_ms;
info->set(FrameInfoIndex::FrameCompleted) = 133_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 132_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(1, container.get()->jankFrameCount());
// Third frame is even longer, cause a jank
// Third frame duration is between 2*interval ~ 3*interval
info = jankTracker.startFrame();
info->set(FrameInfoIndex::IntendedVsync) = 132_ms;
info->set(FrameInfoIndex::Vsync) = 132_ms;
info->set(FrameInfoIndex::SwapBuffersCompleted) = 160_ms;
info->set(FrameInfoIndex::GpuCompleted) = 165_ms;
info->set(FrameInfoIndex::FrameCompleted) = 165_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 148_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(2, container.get()->jankFrameCount());
// 4th frame is double-stuffed with a 2 * interval latency
// 4th frame duration is between 2*interval ~ 3*interval
info = jankTracker.startFrame();
info->set(FrameInfoIndex::IntendedVsync) = 148_ms;
info->set(FrameInfoIndex::Vsync) = 148_ms;
info->set(FrameInfoIndex::SwapBuffersCompleted) = 170_ms;
info->set(FrameInfoIndex::GpuCompleted) = 181_ms;
info->set(FrameInfoIndex::FrameCompleted) = 181_ms;
info->set(FrameInfoIndex::FrameInterval) = 16_ms;
info->set(FrameInfoIndex::FrameDeadline) = 164_ms;
jankTracker.finishFrame(*info, reporter, frameNumber, surfaceId);
ASSERT_EQ(2, container.get()->jankFrameCount());
}