From fb5f9b86bf99b969003cd46fdb16bf427acb0a39 Mon Sep 17 00:00:00 2001 From: Philip Quinn Date: Fri, 10 Feb 2023 12:51:42 -0800 Subject: [PATCH] Update MotionPredictorBenchmark. * Use realistic durations and moving events to ensure the model is fully exercised. * The requested prediction time is only a target, and it is valid for predictions to fall short of it. com.android.perftests.core (2 Tests) [1/2] android.input.MotionPredictorBenchmark#timeRecordAndPredict: PASSED (8.392s) perfetto_file_path: /sdcard/test_results/android.input.MotionPredictorBenchmark_timeRecordAndPredict/PerfettoListener/perfetto_android.input.MotionPredictorBenchmark_timeRecordAndPredict-1.perfetto-trace timeRecordAndPredict_mean (ns): 84059 timeRecordAndPredict_median (ns): 82093 timeRecordAndPredict_min (ns): 77361 timeRecordAndPredict_standardDeviation: 5402 [2/2] android.input.MotionPredictorBenchmark#timeCreatePredictor: PASSED (7.650s) perfetto_file_path: /sdcard/test_results/android.input.MotionPredictorBenchmark_timeCreatePredictor/PerfettoListener/perfetto_android.input.MotionPredictorBenchmark_timeCreatePredictor-1.perfetto-trace timeCreatePredictor_mean (ns): 104809 timeCreatePredictor_median (ns): 105000 timeCreatePredictor_min (ns): 101148 timeCreatePredictor_standardDeviation: 2837 Bug: 167946763 Test: atest MotionPredictorBenchmark Change-Id: I2861a2f377a34eff6571a6ecdc4a34c46fcd753b --- .../android/input/MotionPredictorBenchmark.kt | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt b/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt index 3d447ac40b8c0..fabf8892b5447 100644 --- a/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt +++ b/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt @@ -34,6 +34,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.After import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test @@ -89,7 +90,6 @@ class MotionPredictorBenchmark { private val initialPropertyValue = SystemProperties.get("persist.input.enable_motion_prediction") - private var eventTime = Duration.ofMillis(1) @Before fun setUp() { @@ -109,22 +109,31 @@ class MotionPredictorBenchmark { */ @Test fun timeRecordAndPredict() { - val offset = Duration.ofMillis(1) + val offset = Duration.ofMillis(20) + var eventTime = Duration.ofMillis(0) + val eventInterval = Duration.ofMillis(4) // 240 Hz + + var eventPosition = 0f + val positionInterval = 10f + val predictor = MotionPredictor(getPredictionContext(offset, /*enablePrediction=*/true)) // ACTION_DOWN t=0 x=0 y=0 - predictor.record(getStylusMotionEvent(eventTime, ACTION_DOWN, /*x=*/0f, /*y=*/0f)) + predictor.record(getStylusMotionEvent( + eventTime, ACTION_DOWN, /*x=*/eventPosition, /*y=*/eventPosition)) val state = perfStatusReporter.getBenchmarkState() while (state.keepRunning()) { - eventTime += Duration.ofMillis(1) + eventTime += eventInterval + eventPosition += positionInterval // Send MOVE event and then call .predict - val moveEvent = getStylusMotionEvent(eventTime, ACTION_MOVE, /*x=*/1f, /*y=*/2f) + val moveEvent = getStylusMotionEvent( + eventTime, ACTION_MOVE, /*x=*/eventPosition, /*y=*/eventPosition) predictor.record(moveEvent) - val predictionTime = eventTime + Duration.ofMillis(2) + val predictionTime = eventTime + eventInterval val predicted = predictor.predict(predictionTime.toNanos()) assertEquals(1, predicted.size) - assertEquals((predictionTime + offset).toMillis(), predicted[0].eventTime) + assertTrue(predicted[0].eventTime <= (predictionTime + offset).toMillis()) } } @@ -135,7 +144,7 @@ class MotionPredictorBenchmark { @Test fun timeCreatePredictor() { val context = getPredictionContext( - /*offset=*/Duration.ofMillis(1), /*enablePrediction=*/true) + /*offset=*/Duration.ofMillis(20), /*enablePrediction=*/true) val state = perfStatusReporter.getBenchmarkState() while (state.keepRunning()) {