Avoid occasional 'busy wait' for next render time in main loop. #18491
This commit is contained in:
committed by
Gustas Kažukauskas
parent
b6495113c4
commit
d08d03274b
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user