/// <summary>
/// Renders one frame.
/// </summary>
/// <remarks>
/// Updates all the render targets automatically and then returns, raising frame events before and after.
/// </remarks>
/// <returns>True if execution should continue, false if a quit was requested.</returns>
public void RenderOneFrame()
{
// If we're capping the maximum frame rate, check to see
// if we should sleep
if (microsecondsPerFrame != 0)
{
long current = CaptureCurrentTime();
long diff = Math.Abs(current - lastFrameStartTime);
float microsecondsSinceLastFrame = diff * microsecondsPerTick;
float mdiff = microsecondsPerFrame - microsecondsSinceLastFrame;
// If the difference is greater than 500usec and less
// than 1000 ms, sleep
if (mdiff > 500f && mdiff < 1000000f)
{
Thread.Sleep((int)(Math.Min(mdiff / 1000f, 200f)));
lastFrameStartTime = CaptureCurrentTime();
}
else
{
lastFrameStartTime = current;
}
}
if (queuedEnd)
{
// bail out before continuing
return;
}
// Stop rendering if frame callback says so
oneFrameMeter.Enter();
oneFrameStartedMeter.Enter();
OnFrameStarted();
oneFrameStartedMeter.Exit();
if (!queuedEnd && !dontUpdateRenderTargets)
{
// update all current render targets
updateRenderTargetsMeter.Enter();
UpdateAllRenderTargets();
updateRenderTargetsMeter.Exit();
}
// Stop rendering if frame callback says so
oneFrameEndedMeter.Enter();
OnFrameEnded();
oneFrameEndedMeter.Exit();
oneFrameMeter.Exit();
}