Add option to limit render fps to game tick rate

This helps slow systems that struggle to render 2 frames per game tick.
This commit is contained in:
reaperrr
2021-12-05 14:47:42 +01:00
committed by Pavel Penev
parent 216029dc27
commit 145f6abc09
5 changed files with 34 additions and 3 deletions

View File

@@ -787,8 +787,12 @@ namespace OpenRA
logicInterval = logicWorld == OrderManager.World ? OrderManager.SuggestedTimestep : logicWorld.Timestep;
// Ideal time between screen updates
var maxFramerate = Settings.Graphics.CapFramerate ? Settings.Graphics.MaxFramerate.Clamp(1, 1000) : 1000;
var renderInterval = 1000 / maxFramerate;
var renderInterval = logicInterval;
if (!Settings.Graphics.CapFramerateToGameFps)
{
var maxFramerate = Settings.Graphics.CapFramerate ? Settings.Graphics.MaxFramerate.Clamp(1, 1000) : 1000;
renderInterval = 1000 / maxFramerate;
}
// Tick as fast as possible while restoring game saves, capping rendering at 5 FPS
if (OrderManager.World != null && OrderManager.World.IsLoadingGameSave)

View File

@@ -192,6 +192,9 @@ namespace OpenRA
[Desc("At which frames per second to cap the framerate.")]
public int MaxFramerate = 60;
[Desc("Set a frame rate limit of 1 render frame per game simulation frame (overrides CapFramerate/MaxFramerate).")]
public bool CapFramerateToGameFps = false;
[Desc("Disable the OpenGL debug message callback feature.")]
public bool DisableGLDebugMessageCallback = false;

View File

@@ -139,6 +139,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble");
SettingsUtils.BindCheckboxPref(panel, "VSYNC_CHECKBOX", ds, "VSync");
SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate");
SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_GAMESPEED_CHECKBOX", ds, "CapFramerateToGameFps");
SettingsUtils.BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", ds, "MaxFramerate");
SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
if (panel.GetOrNull<CheckboxWidget>("PAUSE_SHELLMAP_CHECKBOX") != null)
@@ -223,12 +224,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
restartDesc.IsVisible = () => ds.Mode != OriginalGraphicsMode || ds.VideoDisplay != OriginalVideoDisplay || ds.GLProfile != OriginalGLProfile ||
(ds.Mode == WindowMode.Windowed && (origWidthText != windowWidth.Text || origHeightText != windowHeight.Text));
var frameLimitGamespeedCheckbox = panel.Get<CheckboxWidget>("FRAME_LIMIT_GAMESPEED_CHECKBOX");
var frameLimitCheckbox = panel.Get<CheckboxWidget>("FRAME_LIMIT_CHECKBOX");
var frameLimitOrigLabel = frameLimitCheckbox.Text;
var frameLimitLabel = new CachedTransform<int, string>(fps => frameLimitOrigLabel + $" ({fps} FPS)");
frameLimitCheckbox.GetText = () => frameLimitLabel.Update(ds.MaxFramerate);
frameLimitCheckbox.IsDisabled = () => ds.CapFramerateToGameFps;
panel.Get<SliderWidget>("FRAME_LIMIT_SLIDER").IsDisabled = () => !frameLimitCheckbox.IsChecked();
panel.Get<SliderWidget>("FRAME_LIMIT_SLIDER").IsDisabled = () => !frameLimitCheckbox.IsChecked() || frameLimitGamespeedCheckbox.IsChecked();
// Player profile
var ps = Game.Settings.Player;
@@ -305,6 +308,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{
ds.CapFramerate = dds.CapFramerate;
ds.MaxFramerate = dds.MaxFramerate;
ds.CapFramerateToGameFps = dds.CapFramerateToGameFps;
ds.GLProfile = dds.GLProfile;
ds.Mode = dds.Mode;
ds.VideoDisplay = dds.VideoDisplay;

View File

@@ -303,6 +303,16 @@ Container@DISPLAY_PANEL:
Height: 20
Font: Regular
Text: Enable VSync
Container@FRAME_LIMIT_GAMESPEED_CHECKBOX_CONTAINER:
X: PARENT_RIGHT / 2 + 10
Y: 25
Width: PARENT_RIGHT / 2 - 20
Children:
Checkbox@FRAME_LIMIT_GAMESPEED_CHECKBOX:
Width: PARENT_RIGHT
Height: 20
Font: Regular
Text: Limit framerate to game tick rate
Container@ROW:
Width: PARENT_RIGHT - 24
Height: 50

View File

@@ -312,6 +312,16 @@ Container@DISPLAY_PANEL:
Height: 20
Font: Regular
Text: Enable VSync
Container@FRAME_LIMIT_GAMESPEED_CHECKBOX_CONTAINER:
X: PARENT_RIGHT / 2 + 10
Y: 25
Width: PARENT_RIGHT / 2 - 20
Children:
Checkbox@FRAME_LIMIT_GAMESPEED_CHECKBOX:
Width: PARENT_RIGHT
Height: 20
Font: Regular
Text: Limit framerate to game tick rate
Container@ROW:
Width: PARENT_RIGHT - 24
Height: 50