Skip to content

Commit ed71ac5

Browse files
authored
Fix ProMotion (#8020)
## Summary This PR fixes the conditional statements that caused us to always limit the frame rate to 60 FPS, even when it would be possible to switch to 120 FPS. https://github.com/user-attachments/assets/0f1d657f-d1fd-40ed-909a-707d624079e4 ## Test plan
1 parent ada7663 commit ed71ac5

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

packages/react-native-worklets/apple/worklets/apple/AnimationFrameQueue.mm

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,14 @@
1616
const auto POOR = CAFrameRateRangeMake(10, 24, 24);
1717
} // namespace FrameRateRange
1818

19-
enum FrameRateRangeEnum {
20-
BEST,
21-
STANDARD,
22-
LOW,
23-
POOR,
24-
};
25-
2619
@implementation AnimationFrameQueue {
2720
/* DisplayLink is thread safe. */
2821
WorkletsDisplayLink *displayLink_;
2922
std::vector<std::function<void(double)>> frameCallbacks_;
3023
std::mutex callbacksMutex_;
3124
std::chrono::duration<double, std::milli> timeDeltas_[TIME_SAMPLES_AMOUNT];
3225
int timeDeltaIndex_;
33-
FrameRateRangeEnum curentFrameRate_;
26+
CAFrameRateRange currentFrameRate_;
3427
}
3528

3629
typedef void (^AnimationFrameCallback)(WorkletsDisplayLink *displayLink);
@@ -43,7 +36,7 @@ - (instancetype)init
4336
if constexpr (worklets::StaticFeatureFlags::getFlag("IOS_DYNAMIC_FRAMERATE_ENABLED")) {
4437
bool supportsProMotion = [UIScreen mainScreen].maximumFramesPerSecond > 60;
4538
SEL frameCallback = supportsProMotion ? @selector(executeQueueForProMotion:) : @selector(executeQueue:);
46-
curentFrameRate_ = supportsProMotion ? BEST : STANDARD;
39+
currentFrameRate_ = supportsProMotion ? FrameRateRange::BEST : FrameRateRange::STANDARD;
4740
displayLink_ = [WorkletsDisplayLink displayLinkWithTarget:self selector:frameCallback];
4841
} else {
4942
displayLink_ = [WorkletsDisplayLink displayLinkWithTarget:self selector:@selector(executeQueue:)];
@@ -111,19 +104,24 @@ - (void)executeQueueForProMotion:(WorkletsDisplayLink *)displayLink
111104
// Perform this on every TIME_SAMPLES_AMOUNT-nth frame instead of each one
112105
return;
113106
}
114-
float averageFrameDuration = 0;
107+
float averageComputationTime = 0;
115108
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;
117121
}
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;
127125
}
128126
}
129127

0 commit comments

Comments
 (0)