Pause rendering when the window is minimized
This commit is contained in:
@@ -828,8 +828,7 @@ namespace OpenRA
|
||||
|
||||
var haveSomeTimeUntilNextLogic = now < nextLogic;
|
||||
var isTimeToRender = now >= nextRender;
|
||||
|
||||
if ((isTimeToRender && haveSomeTimeUntilNextLogic) || forceRender)
|
||||
if (!Renderer.WindowIsSuspended && ((isTimeToRender && haveSomeTimeUntilNextLogic) || forceRender))
|
||||
{
|
||||
nextRender = now + renderInterval;
|
||||
|
||||
@@ -844,6 +843,19 @@ namespace OpenRA
|
||||
RenderTick();
|
||||
renderBeforeNextTick = false;
|
||||
}
|
||||
|
||||
// Simulate a render tick if it was time to render but we skip actually rendering
|
||||
if (Renderer.WindowIsSuspended && isTimeToRender)
|
||||
{
|
||||
// Make sure that nextUpdate is set to a proper minimum interval
|
||||
nextRender = now + renderInterval;
|
||||
|
||||
// Still process SDL events to allow a restore to come through
|
||||
Renderer.Window.PumpInput(new NullInputHandler());
|
||||
|
||||
// Ensure that we still logic tick despite not rendering
|
||||
renderBeforeNextTick = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
Thread.Sleep((int)(nextUpdate - now));
|
||||
|
||||
@@ -59,6 +59,7 @@ namespace OpenRA
|
||||
int DisplayCount { get; }
|
||||
int CurrentDisplay { get; }
|
||||
bool HasInputFocus { get; }
|
||||
bool IsSuspended { get; }
|
||||
|
||||
event Action<float, float, float, float> OnWindowScaleChanged;
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ namespace OpenRA
|
||||
public RgbaSpriteRenderer RgbaSpriteRenderer { get; private set; }
|
||||
|
||||
public bool WindowHasInputFocus => Window.HasInputFocus;
|
||||
public bool WindowIsSuspended => Window.IsSuspended;
|
||||
|
||||
public IReadOnlyDictionary<string, SpriteFont> Fonts;
|
||||
|
||||
|
||||
@@ -94,6 +94,18 @@ namespace OpenRA.Platforms.Default
|
||||
case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED:
|
||||
device.WindowSizeChanged();
|
||||
break;
|
||||
|
||||
case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_HIDDEN:
|
||||
case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_MINIMIZED:
|
||||
device.IsSuspended = true;
|
||||
break;
|
||||
|
||||
case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_EXPOSED:
|
||||
case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SHOWN:
|
||||
case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_MAXIMIZED:
|
||||
case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_RESTORED:
|
||||
device.IsSuspended = false;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -99,6 +99,8 @@ namespace OpenRA.Platforms.Default
|
||||
|
||||
public bool HasInputFocus { get; internal set; }
|
||||
|
||||
public bool IsSuspended { get; internal set; }
|
||||
|
||||
public GLProfile GLProfile
|
||||
{
|
||||
get
|
||||
|
||||
Reference in New Issue
Block a user