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 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'
// 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;
nextRender = now + renderInterval;
RenderTick();
renderBeforeNextTick = false;
// Pick the minimum allowed FPS (the lower between 'minReplayFPS'
// 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;
}
}
// Simulate a render tick if it was time to render but we skip actually rendering
if (Renderer.WindowIsSuspended && isTimeToRender)
else
{
// Make sure that nextUpdate is set to a proper minimum interval
nextRender = now + renderInterval;
// Simulate a render tick if it was time to render but we skip actually rendering
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
Renderer.Window.PumpInput(new NullInputHandler());
// 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;
// Ensure that we still logic tick despite not rendering
renderBeforeNextTick = false;
}
else
{
// Avoid busy wait.
Thread.Sleep((int)(nextRender - now));
}
}
}
else