Add 120 FPS option for devices with high refresh rate displays

This commit is contained in:
Cameron Gutman
2018-10-22 20:24:51 -07:00
parent 993bfca0ae
commit 736887b945
4 changed files with 71 additions and 28 deletions
+2
View File
@@ -57,5 +57,7 @@
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>CADisableMinimumFrameDuration</key>
<true/>
</dict> </dict>
</plist> </plist>
@@ -109,16 +109,42 @@ static const int bitrateTable[] = {
// Ensure we pick a bitrate that falls exactly onto a slider notch // Ensure we pick a bitrate that falls exactly onto a slider notch
_bitrate = bitrateTable[[self getSliderValueForBitrate:[currentSettings.bitrate intValue]]]; _bitrate = bitrateTable[[self getSliderValueForBitrate:[currentSettings.bitrate intValue]]];
NSInteger framerate = [currentSettings.framerate integerValue] == 30 ? 0 : 1; NSInteger framerate;
switch ([currentSettings.framerate integerValue]) {
case 30:
framerate = 0;
break;
default:
case 60:
framerate = 1;
break;
case 120:
framerate = 2;
break;
}
NSInteger resolution; NSInteger resolution;
if ([currentSettings.height integerValue] == 360) { switch ([currentSettings.height integerValue]) {
resolution = 0; case 360:
} else if ([currentSettings.height integerValue] == 720) { resolution = 0;
resolution = 1; break;
} else if ([currentSettings.height integerValue] == 1080) { default:
resolution = 2; case 720:
} else { resolution = 1;
resolution = 1; break;
case 1080:
resolution = 2;
break;
}
// Only show the 120 FPS option if we have a > 60-ish Hz display
bool enable120Fps = false;
if (@available(iOS 10.3, *)) {
if ([UIScreen mainScreen].maximumFramesPerSecond > 62) {
enable120Fps = true;
}
}
if (!enable120Fps) {
[self.framerateSelector removeSegmentAtIndex:2 animated:NO];
} }
[self.optimizeSettingsSelector setSelectedSegmentIndex:currentSettings.optimizeGames ? 1 : 0]; [self.optimizeSettingsSelector setSelectedSegmentIndex:currentSettings.optimizeGames ? 1 : 0];
@@ -139,30 +165,34 @@ static const int bitrateTable[] = {
} }
- (void) newResolutionFpsChosen { - (void) newResolutionFpsChosen {
NSInteger frameRate = [self getChosenFrameRate]; NSInteger fps = [self getChosenFrameRate];
NSInteger resHeight = [self getChosenStreamHeight]; NSInteger width = [self getChosenStreamWidth];
NSInteger height = [self getChosenStreamHeight];
NSInteger defaultBitrate; NSInteger defaultBitrate;
// 1080p60 is 20 Mbps // This table prefers 16:10 resolutions because they are
if (frameRate == 60 && resHeight == 1080) { // only slightly more pixels than the 16:9 equivalents, so
defaultBitrate = 20000; // we don't want to bump those 16:10 resolutions up to the
// next 16:9 slot.
//
// This logic is shamelessly stolen from Moonlight Qt:
// https://github.com/moonlight-stream/moonlight-qt/blob/master/app/settings/streamingpreferences.cpp
if (width * height <= 640 * 360) {
defaultBitrate = 1000 * (fps / 30.0);
} }
// 720p60 and 1080p30 are 10 Mbps // This covers 1280x720 and 1280x800 too
else if ((frameRate == 60 && resHeight == 720) || else if (width * height <= 1366 * 768) {
(frameRate == 30 && resHeight == 1080)) { defaultBitrate = 5000 * (fps / 30.0);
defaultBitrate = 10000;
} }
// 720p30 is 5 Mbps else if (width * height <= 1920 * 1200) {
else if (resHeight == 720) { defaultBitrate = 10000 * (fps / 30.0);
defaultBitrate = 5000;
} }
// 360p60 is 2 Mbps else if (width * height <= 2560 * 1600) {
else if (frameRate == 60 && resHeight == 360) { defaultBitrate = 20000 * (fps / 30.0);
defaultBitrate = 2000;
} }
// 360p30 is 1 Mbps else /* if (width * height <= 3840 * 2160) */ {
else { defaultBitrate = 40000 * (fps / 30.0);
defaultBitrate = 1000;
} }
// We should always be exactly on a slider position with default bitrates // We should always be exactly on a slider position with default bitrates
@@ -185,7 +215,16 @@ static const int bitrateTable[] = {
} }
- (NSInteger) getChosenFrameRate { - (NSInteger) getChosenFrameRate {
return [self.framerateSelector selectedSegmentIndex] == 0 ? 30 : 60; switch ([self.framerateSelector selectedSegmentIndex]) {
case 0:
return 30;
case 1:
return 60;
case 2:
return 120;
default:
abort();
}
} }
- (NSInteger) getChosenStreamHeight { - (NSInteger) getChosenStreamHeight {
+1
View File
@@ -110,6 +110,7 @@
<segments> <segments>
<segment title="30 FPS"/> <segment title="30 FPS"/>
<segment title="60 FPS"/> <segment title="60 FPS"/>
<segment title="120 FPS"/>
</segments> </segments>
<color key="tintColor" red="0.6716768741607666" green="0.61711704730987549" blue="0.99902987480163574" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="tintColor" red="0.6716768741607666" green="0.61711704730987549" blue="0.99902987480163574" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</segmentedControl> </segmentedControl>
+1
View File
@@ -127,6 +127,7 @@
<segments> <segments>
<segment title="30 FPS"/> <segment title="30 FPS"/>
<segment title="60 FPS"/> <segment title="60 FPS"/>
<segment title="120 FPS"/>
</segments> </segments>
<color key="tintColor" red="0.6716768741607666" green="0.61711704730987549" blue="0.99902987480163574" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="tintColor" red="0.6716768741607666" green="0.61711704730987549" blue="0.99902987480163574" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</segmentedControl> </segmentedControl>