Enable high refresh rates on iOS

Fixes https://github.com/libsdl-org/SDL/issues/7518

(cherry picked from commit 835b6e0c1a)
This commit is contained in:
Sam Lantinga committed 2024-12-18 14:43:33 -08:00
1 parent 7f880c9121
commit 974098464f
1 file changed
+18 -1
+18 -1
View File
@@ -118,6 +118,20 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
SDL_HideHomeIndicatorHintChanged, SDL_HideHomeIndicatorHintChanged,
(__bridge void *) self); (__bridge void *) self);
#endif #endif
/* Enable high refresh rates on iOS
* To enable this on phones, you should add the following line to Info.plist:
* <key>CADisableMinimumFrameDurationOnPhone</key> <true/>
*/
if (@available(iOS 15.0, tvOS 15.0, *)) {
SDL_DisplayMode mode;
if (SDL_GetDesktopDisplayMode(0, &mode) == 0 && mode.refresh_rate > 60.0f) {
int frame_rate = (int)mode.refresh_rate;
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(doLoop:)];
displayLink.preferredFrameRateRange = CAFrameRateRangeMake((frame_rate * 2) / 3, frame_rate, frame_rate);
[displayLink addToRunLoop:NSRunLoop.currentRunLoop forMode:NSDefaultRunLoopMode];
}
}
} }
return self; return self;
} }
@@ -147,6 +161,9 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
{ {
[self stopAnimation]; [self stopAnimation];
if (interval <= 0) {
interval = 1;
}
animationInterval = interval; animationInterval = interval;
animationCallback = callback; animationCallback = callback;
animationCallbackParam = callbackParam; animationCallbackParam = callbackParam;
@@ -191,7 +208,7 @@ SDL_HideHomeIndicatorHintChanged(void *userdata, const char *name, const char *o
- (void)doLoop:(CADisplayLink*)sender - (void)doLoop:(CADisplayLink*)sender
{ {
/* Don't run the game loop while a messagebox is up */ /* Don't run the game loop while a messagebox is up */
if (!UIKit_ShowingMessageBox()) { if (animationCallback && !UIKit_ShowingMessageBox()) {
/* See the comment in the function definition. */ /* See the comment in the function definition. */
#if defined(SDL_VIDEO_OPENGL_ES) || defined(SDL_VIDEO_OPENGL_ES2) #if defined(SDL_VIDEO_OPENGL_ES) || defined(SDL_VIDEO_OPENGL_ES2)
UIKit_GL_RestoreCurrentContext(); UIKit_GL_RestoreCurrentContext();