SF: Improve LayerInfo::calculateAverageFrameTime
This refactors and improves LayerInfo::calculateAverageFrameTime.
The behaviour is changed in two ways:
* if two consecutive frames are too close to each other we count
them as one frame and consider the delta between them in
the total. This gives a better estimation for the average
refresh rate. See CalculateAverageFrameTimeTest::ignoresSmallPeriods
which was failing with the previous implementation.
* if two consecutive frames are too far apart we discard the delta
between them. This is covered by the test "ignoresLargePeriods".
Fixes: 170476958
Test: atest CalculateAverageFrameTimeTest
Change-Id: If98199bb8198f74c93e93c9996107c021f1bc7ba
diff --git a/services/surfaceflinger/Scheduler/LayerInfo.h b/services/surfaceflinger/Scheduler/LayerInfo.h
index 427cc9e..e32ba09 100644
--- a/services/surfaceflinger/Scheduler/LayerInfo.h
+++ b/services/surfaceflinger/Scheduler/LayerInfo.h
@@ -49,12 +49,13 @@
// Layer is considered frequent if the earliest value in the window of most recent present times
// is within a threshold. If a layer is infrequent, its average refresh rate is disregarded in
// favor of a low refresh rate.
- static constexpr size_t FREQUENT_LAYER_WINDOW_SIZE = 3;
- static constexpr Fps MIN_FPS_FOR_FREQUENT_LAYER{10.0f};
- static constexpr auto MAX_FREQUENT_LAYER_PERIOD_NS =
- std::chrono::nanoseconds(MIN_FPS_FOR_FREQUENT_LAYER.getPeriodNsecs()) + 1ms;
+ static constexpr size_t kFrequentLayerWindowSize = 3;
+ static constexpr Fps kMinFpsForFrequentLayer{10.0f};
+ static constexpr auto kMaxPeriodForFrequentLayerNs =
+ std::chrono::nanoseconds(kMinFpsForFrequentLayer.getPeriodNsecs()) + 1ms;
friend class LayerHistoryTest;
+ friend class LayerInfoTest;
public:
// Holds information about the layer vote
@@ -121,7 +122,7 @@
private:
// Used to store the layer timestamps
struct FrameTimeData {
- nsecs_t presetTime; // desiredPresentTime, if provided
+ nsecs_t presentTime; // desiredPresentTime, if provided
nsecs_t queueTime; // buffer queue time
bool pendingConfigChange;
};
@@ -196,6 +197,10 @@
// Used for sanitizing the heuristic data. If two frames are less than
// this period apart from each other they'll be considered as duplicates.
static constexpr nsecs_t kMinPeriodBetweenFrames = Fps(120.f).getPeriodNsecs();
+ // Used for sanitizing the heuristic data. If two frames are more than
+ // this period apart from each other, the interval between them won't be
+ // taken into account when calculating average frame rate.
+ static constexpr nsecs_t kMaxPeriodBetweenFrames = kMinFpsForFrequentLayer.getPeriodNsecs();
LayerHistory::LayerVoteType mDefaultVote;
LayerVote mLayerVote;