protected override void OnUpdateFrame(FrameEventArgs e)
{
TimeFactor = MainLoop.TimeFactor;
// timer
double RealTimeElapsed;
double TimeElapsed;
if (Game.SecondsSinceMidnight >= Game.StartupTime)
{
RealTimeElapsed = CPreciseTimer.GetElapsedTime();
TimeElapsed = RealTimeElapsed * (double)TimeFactor;
if (loadComplete && !firstFrame)
{
//Our current in-game time is equal to or greater than the startup time, but the first frame has not yet been processed
//Therefore, reset the timer to zero as time consuming texture loads may cause us to be late at the first station
RealTimeElapsed = 0.0;
TimeElapsed = 0.0;
firstFrame = true;
}
}
else
{
RealTimeElapsed = 0.0;
TimeElapsed = Game.StartupTime - Game.SecondsSinceMidnight;
}
//We only want to update the simulation if we aren't in a menu
if (Game.CurrentInterface == Game.InterfaceType.Normal)
{
#if DEBUG
//If we're in debug mode and a frame takes greater than a second to render, we can safely assume that VS has hit a breakpoint
//Check this and the sim no longer barfs because the update time was too great
if (RealTimeElapsed > 1)
{
RealTimeElapsed = 0.0;
TimeElapsed = 0.0;
}
#endif
TotalTimeElapsedForInfo += TimeElapsed;
TotalTimeElapsedForSectionUpdate += TimeElapsed;
if (TotalTimeElapsedForSectionUpdate >= 1.0)
{
if (Game.Sections.Length != 0)
{
Game.UpdateSection(Game.Sections.Length - 1);
}
TotalTimeElapsedForSectionUpdate = 0.0;
}
// events
// update simulation in chunks
{
const double chunkTime = 1.0 / 2.0;
if (TimeElapsed <= chunkTime)
{
Game.SecondsSinceMidnight += TimeElapsed;
TrainManager.UpdateTrains(TimeElapsed);
}
else
{
const int maxChunks = 2;
int chunks = Math.Min((int)Math.Round(TimeElapsed / chunkTime), maxChunks);
double time = TimeElapsed / (double)chunks;
for (int i = 0; i < chunks; i++)
{
Game.SecondsSinceMidnight += time;
TrainManager.UpdateTrains(time);
}
}
}
Game.CurrentScore.Update(TimeElapsed);
Game.UpdateMessages();
Game.UpdateScoreMessages(TimeElapsed);
}
RenderTimeElapsed += TimeElapsed;
RenderRealTimeElapsed += RealTimeElapsed;
}