mirror of
https://github.com/moonlight-stream/moonlight-ios.git
synced 2026-06-17 14:11:35 +00:00
Add 120 FPS option for devices with high refresh rate displays
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user