Merge 51b666edef3bce628a32ea1cc6af53757a95b939 into cedd6ffae618e4639518746a73450fa12f05c626

This commit is contained in:
Skryptonyte 2025-07-09 20:18:38 +10:00 committed by GitHub
commit 8281c80a6c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 90 additions and 3 deletions

View File

@ -137,5 +137,7 @@
</dict>
</dict>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
</dict>
</plist>

View File

@ -75,6 +75,9 @@ int Game_NumStates = 1;
const char* const FpsLimit_Names[FPS_LIMIT_COUNT] = {
"LimitVSync", "Limit30FPS", "Limit60FPS", "Limit120FPS", "Limit144FPS", "LimitNone",
#ifdef CC_BUILD_IOS
"LimitProMotion",
#endif
};
static struct IGameComponent* comps_head;
@ -497,6 +500,10 @@ void Game_SetFpsLimit(int method) {
case FPS_LIMIT_30: minFrameTime = 1000/30.0f; break;
}
Gfx_SetVSync(method == FPS_LIMIT_VSYNC);
#ifdef CC_BUILD_IOS
extern void Gfx_SetProMotion(cc_bool);
Gfx_SetProMotion(method == FPS_LIMIT_PROMOTION);
#endif
Game_SetMinFrameTime(minFrameTime);
}

View File

@ -84,7 +84,11 @@ extern struct GameVersion Game_Version;
extern void GameVersion_Load(void);
enum FpsLimitMethod {
FPS_LIMIT_VSYNC, FPS_LIMIT_30, FPS_LIMIT_60, FPS_LIMIT_120, FPS_LIMIT_144, FPS_LIMIT_NONE, FPS_LIMIT_COUNT
FPS_LIMIT_VSYNC, FPS_LIMIT_30, FPS_LIMIT_60, FPS_LIMIT_120, FPS_LIMIT_144, FPS_LIMIT_NONE,
#ifdef CC_BUILD_IOS
FPS_LIMIT_PROMOTION,
#endif
FPS_LIMIT_COUNT
};
extern const char* const FpsLimit_Names[FPS_LIMIT_COUNT];

View File

@ -775,7 +775,11 @@ static void GraphicsOptionsScreen_InitWidgets(struct MenuOptionsScreen* s) {
"&eVSync: &fNumber of frames rendered is at most the monitor's refresh rate.\n" \
"&e30/60/120/144 FPS: &fRenders 30/60/120/144 frames at most each second.\n" \
"&eNoLimit: &fRenders as many frames as possible each second.\n" \
"&cNoLimit is pointless - it wastefully renders frames that you don't even see!");
"&cNoLimit is pointless - it wastefully renders frames that you don't even see!"
#ifdef CC_BUILD_IOS
"\n&eProMotion: &fRender above 60Hz on devices with ProMotion."
#endif
);
MenuOptionsScreen_AddInt(s, "View distance",
8, 4096, 512,
GrO_GetViewDist, GrO_SetViewDist, NULL);

View File

@ -34,6 +34,7 @@ UITextField* kb_widget;
CGContextRef win_ctx;
UIView* view_handle;
UIViewController* cc_controller;
CADisplayLink *displayLink = Nil;
UIColor* ToUIColor(BitmapCol color, float A);
NSString* ToNSString(const cc_string* text);
@ -551,7 +552,10 @@ void Window_Create3D(int width, int height) {
Init3DLayer();
}
void Window_Destroy(void) { }
void Window_Destroy(void) {
[cc_controller.view removeFromSuperview];
cc_controller.view = Nil;
}
/*########################################################################################################################*
@ -653,6 +657,22 @@ cc_bool GLContext_SwapBuffers(void) {
return true;
}
void Gfx_SetProMotion(bool pro_motion) {
/*
* If ProMotion is off, pause our CADisplayLink object and hence disable higher
* ranges of ProMotion. Otherwise, users may experience framepacing issues
* with other FPS limit options.
*/
if (displayLink) {
if (pro_motion)
Platform_LogConst("ProMotion: ON");
else
Platform_LogConst("ProMotion: OFF");
displayLink.paused = !pro_motion;
}
}
void GLContext_SetVSync(cc_bool vsync) { }
void GLContext_GetApiInfo(cc_string* info) { }
@ -663,6 +683,56 @@ void GLContext_GetApiInfo(cc_string* info) { }
return [CAEAGLLayer class];
}
- (void)commonInit {
if (@available(iOS 15.0, *)) {
NSInteger maxFPS = [UIScreen.mainScreen maximumFramesPerSecond];
displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLink:)];
/* Suggest the device to possibily increase frame-rate cap from the usual 60
* up to 120. Due to how quirky ProMotion is, supported iPhones in
* practice may achieve 80FPS at best. In other words, there is no way to
* force a specific refresh rate.
* https://developer.apple.com/documentation/quartzcore/optimizing_promotion_refresh_rates_for_iphone_13_pro_and_ipad_pro?language=objc
*/
displayLink.preferredFrameRateRange = CAFrameRateRangeMake(maxFPS, maxFPS, maxFPS);
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
Platform_LogConst("CADisplayLink Initialized");
} else {
displayLink = Nil;
}
}
- (void)displayLink:(CADisplayLink *)sender {
/* Dummy display link callback */
}
- (id)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder: coder];
[self commonInit];
return self;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
[self commonInit];
return self;
}
- (void)removeFromSuperview {
[super removeFromSuperview];
if (displayLink) {
[displayLink invalidate];
displayLink = Nil;
Platform_LogConst("CADisplayLink Invalidated");
}
}
- (void)layoutSubviews {
[super layoutSubviews];
GLContext_OnLayout();