16
16
const auto POOR = CAFrameRateRangeMake(10 , 24 , 24 );
17
17
} // namespace FrameRateRange
18
18
19
- enum FrameRateRangeEnum {
20
- BEST,
21
- STANDARD,
22
- LOW,
23
- POOR,
24
- };
25
-
26
19
@implementation AnimationFrameQueue {
27
20
/* DisplayLink is thread safe. */
28
21
WorkletsDisplayLink *displayLink_;
29
22
std::vector<std::function<void (double )>> frameCallbacks_;
30
23
std::mutex callbacksMutex_;
31
24
std::chrono::duration<double , std::milli> timeDeltas_[TIME_SAMPLES_AMOUNT];
32
25
int timeDeltaIndex_;
33
- FrameRateRangeEnum curentFrameRate_ ;
26
+ CAFrameRateRange currentFrameRate_ ;
34
27
}
35
28
36
29
typedef void (^AnimationFrameCallback)(WorkletsDisplayLink *displayLink);
@@ -43,7 +36,7 @@ - (instancetype)init
43
36
if constexpr (worklets::StaticFeatureFlags::getFlag (" IOS_DYNAMIC_FRAMERATE_ENABLED" )) {
44
37
bool supportsProMotion = [UIScreen mainScreen ].maximumFramesPerSecond > 60 ;
45
38
SEL frameCallback = supportsProMotion ? @selector (executeQueueForProMotion: ) : @selector (executeQueue: );
46
- curentFrameRate_ = supportsProMotion ? BEST : STANDARD;
39
+ currentFrameRate_ = supportsProMotion ? FrameRateRange:: BEST : FrameRateRange:: STANDARD;
47
40
displayLink_ = [WorkletsDisplayLink displayLinkWithTarget: self selector: frameCallback];
48
41
} else {
49
42
displayLink_ = [WorkletsDisplayLink displayLinkWithTarget: self selector: @selector (executeQueue: )];
@@ -111,19 +104,24 @@ - (void)executeQueueForProMotion:(WorkletsDisplayLink *)displayLink
111
104
// Perform this on every TIME_SAMPLES_AMOUNT-nth frame instead of each one
112
105
return ;
113
106
}
114
- float averageFrameDuration = 0 ;
107
+ float averageComputationTime = 0 ;
115
108
for (int i = 0 ; i < TIME_SAMPLES_AMOUNT; i++) {
116
- averageFrameDuration += timeDeltas_[i].count ();
109
+ averageComputationTime += timeDeltas_[i].count ();
110
+ }
111
+ averageComputationTime = averageComputationTime / TIME_SAMPLES_AMOUNT;
112
+ CAFrameRateRange frameRateRange;
113
+ if (averageComputationTime < 8 ) {
114
+ frameRateRange = FrameRateRange::BEST;
115
+ } else if (averageComputationTime < 16 ) {
116
+ frameRateRange = FrameRateRange::STANDARD;
117
+ } else if (averageComputationTime < 33 ) {
118
+ frameRateRange = FrameRateRange::LOW;
119
+ } else {
120
+ frameRateRange = FrameRateRange::POOR;
117
121
}
118
- averageFrameDuration = averageFrameDuration / TIME_SAMPLES_AMOUNT;
119
- if (averageFrameDuration < 8 && curentFrameRate_ != BEST) {
120
- displayLink_.preferredFrameRateRange = FrameRateRange::BEST;
121
- } else if (averageFrameDuration < 16 && curentFrameRate_ != STANDARD) {
122
- displayLink_.preferredFrameRateRange = FrameRateRange::STANDARD;
123
- } else if (averageFrameDuration < 33 && curentFrameRate_ != LOW) {
124
- displayLink_.preferredFrameRateRange = FrameRateRange::LOW;
125
- } else if (curentFrameRate_ != POOR) {
126
- displayLink_.preferredFrameRateRange = FrameRateRange::POOR;
122
+ if (currentFrameRate_.preferred != frameRateRange.preferred ) {
123
+ displayLink_.preferredFrameRateRange = frameRateRange;
124
+ currentFrameRate_ = frameRateRange;
127
125
}
128
126
}
129
127
0 commit comments