Avoid occasional 'busy wait' for next render time in main loop. #18491

This commit is contained in:
Vapre
2025-06-17 20:52:19 +02:00
committed by Gustas Kažukauskas
parent b6495113c4
commit d08d03274b

View File

@@ -863,33 +863,45 @@ namespace OpenRA
var haveSomeTimeUntilNextLogic = now < nextLogic; var haveSomeTimeUntilNextLogic = now < nextLogic;
var isTimeToRender = now >= nextRender; var isTimeToRender = now >= nextRender;
if (!Renderer.WindowIsSuspended && ((isTimeToRender && haveSomeTimeUntilNextLogic) || forceRender)) if (!Renderer.WindowIsSuspended)
{ {
nextRender = now + renderInterval; if (isTimeToRender || forceRender)
{
if (haveSomeTimeUntilNextLogic || forceRender)
RenderTick();
// Pick the minimum allowed FPS (the lower between 'minReplayFPS' nextRender = now + renderInterval;
// and the user's max frame rate) and convert it to maximum time
// allowed between screen updates.
// We do this before rendering to include the time rendering takes
// in this interval.
var maxRenderInterval = Math.Max(1000 / MinReplayFps, renderInterval);
forcedNextRender = now + maxRenderInterval;
RenderTick(); // Pick the minimum allowed FPS (the lower between 'minReplayFPS'
renderBeforeNextTick = false; // and the user's max frame rate) and convert it to maximum time
// allowed between screen updates.
// We do this before rendering to include the time rendering takes
// in this interval.
var maxRenderInterval = Math.Max(1000 / MinReplayFps, renderInterval);
forcedNextRender = now + maxRenderInterval;
renderBeforeNextTick = false;
}
} }
else
// 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 // Simulate a render tick if it was time to render but we skip actually rendering
nextRender = now + renderInterval; if (isTimeToRender || forceRender)
{
// 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 // Still process SDL events to allow a restore to come through
Renderer.Window.PumpInput(new NullInputHandler()); Renderer.Window.PumpInput(new NullInputHandler());
// Ensure that we still logic tick despite not rendering // Ensure that we still logic tick despite not rendering
renderBeforeNextTick = false; renderBeforeNextTick = false;
}
else
{
// Avoid busy wait.
Thread.Sleep((int)(nextRender - now));
}
} }
} }
else else