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:
@@ -787,8 +787,12 @@ namespace OpenRA
|
|||||||
logicInterval = logicWorld == OrderManager.World ? OrderManager.SuggestedTimestep : logicWorld.Timestep;
|
logicInterval = logicWorld == OrderManager.World ? OrderManager.SuggestedTimestep : logicWorld.Timestep;
|
||||||
|
|
||||||
// Ideal time between screen updates
|
// Ideal time between screen updates
|
||||||
var maxFramerate = Settings.Graphics.CapFramerate ? Settings.Graphics.MaxFramerate.Clamp(1, 1000) : 1000;
|
var renderInterval = logicInterval;
|
||||||
var renderInterval = 1000 / maxFramerate;
|
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
|
// Tick as fast as possible while restoring game saves, capping rendering at 5 FPS
|
||||||
if (OrderManager.World != null && OrderManager.World.IsLoadingGameSave)
|
if (OrderManager.World != null && OrderManager.World.IsLoadingGameSave)
|
||||||
|
|||||||
@@ -192,6 +192,9 @@ namespace OpenRA
|
|||||||
[Desc("At which frames per second to cap the framerate.")]
|
[Desc("At which frames per second to cap the framerate.")]
|
||||||
public int MaxFramerate = 60;
|
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.")]
|
[Desc("Disable the OpenGL debug message callback feature.")]
|
||||||
public bool DisableGLDebugMessageCallback = false;
|
public bool DisableGLDebugMessageCallback = false;
|
||||||
|
|
||||||
|
|||||||
@@ -139,6 +139,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble");
|
SettingsUtils.BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble");
|
||||||
SettingsUtils.BindCheckboxPref(panel, "VSYNC_CHECKBOX", ds, "VSync");
|
SettingsUtils.BindCheckboxPref(panel, "VSYNC_CHECKBOX", ds, "VSync");
|
||||||
SettingsUtils.BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate");
|
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.BindIntSliderPref(panel, "FRAME_LIMIT_SLIDER", ds, "MaxFramerate");
|
||||||
SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
|
SettingsUtils.BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
|
||||||
if (panel.GetOrNull<CheckboxWidget>("PAUSE_SHELLMAP_CHECKBOX") != null)
|
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 ||
|
restartDesc.IsVisible = () => ds.Mode != OriginalGraphicsMode || ds.VideoDisplay != OriginalVideoDisplay || ds.GLProfile != OriginalGLProfile ||
|
||||||
(ds.Mode == WindowMode.Windowed && (origWidthText != windowWidth.Text || origHeightText != windowHeight.Text));
|
(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 frameLimitCheckbox = panel.Get<CheckboxWidget>("FRAME_LIMIT_CHECKBOX");
|
||||||
var frameLimitOrigLabel = frameLimitCheckbox.Text;
|
var frameLimitOrigLabel = frameLimitCheckbox.Text;
|
||||||
var frameLimitLabel = new CachedTransform<int, string>(fps => frameLimitOrigLabel + $" ({fps} FPS)");
|
var frameLimitLabel = new CachedTransform<int, string>(fps => frameLimitOrigLabel + $" ({fps} FPS)");
|
||||||
frameLimitCheckbox.GetText = () => frameLimitLabel.Update(ds.MaxFramerate);
|
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
|
// Player profile
|
||||||
var ps = Game.Settings.Player;
|
var ps = Game.Settings.Player;
|
||||||
@@ -305,6 +308,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
{
|
{
|
||||||
ds.CapFramerate = dds.CapFramerate;
|
ds.CapFramerate = dds.CapFramerate;
|
||||||
ds.MaxFramerate = dds.MaxFramerate;
|
ds.MaxFramerate = dds.MaxFramerate;
|
||||||
|
ds.CapFramerateToGameFps = dds.CapFramerateToGameFps;
|
||||||
ds.GLProfile = dds.GLProfile;
|
ds.GLProfile = dds.GLProfile;
|
||||||
ds.Mode = dds.Mode;
|
ds.Mode = dds.Mode;
|
||||||
ds.VideoDisplay = dds.VideoDisplay;
|
ds.VideoDisplay = dds.VideoDisplay;
|
||||||
|
|||||||
@@ -303,6 +303,16 @@ Container@DISPLAY_PANEL:
|
|||||||
Height: 20
|
Height: 20
|
||||||
Font: Regular
|
Font: Regular
|
||||||
Text: Enable VSync
|
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:
|
Container@ROW:
|
||||||
Width: PARENT_RIGHT - 24
|
Width: PARENT_RIGHT - 24
|
||||||
Height: 50
|
Height: 50
|
||||||
|
|||||||
@@ -312,6 +312,16 @@ Container@DISPLAY_PANEL:
|
|||||||
Height: 20
|
Height: 20
|
||||||
Font: Regular
|
Font: Regular
|
||||||
Text: Enable VSync
|
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:
|
Container@ROW:
|
||||||
Width: PARENT_RIGHT - 24
|
Width: PARENT_RIGHT - 24
|
||||||
Height: 50
|
Height: 50
|
||||||
|
|||||||
Reference in New Issue
Block a user