public static void UpdateLoop() { #if CATCHERROR_UPDATELOOP try { #endif if (Terraria_Server.Main.rand == null) { Terraria_Server.Main.rand = new Random((int)DateTime.Now.Ticks); } bool hibernate = properties.StopUpdatesWhenEmpty, backup = false; int collect = 0, backupInterval = properties.BackupInterval; DateTime backupDate = DateTime.Now; if (backupInterval > 0) { backup = properties.AllowBackups; } if (properties.SimpleLoop) { Stopwatch s = new Stopwatch(); s.Start(); double updateTime = 16.66666666666667; double nextUpdate = s.ElapsedMilliseconds + updateTime; while (!NetPlay.disconnect) { double now = s.ElapsedMilliseconds; double left = nextUpdate - now; if (left >= 0) { while (left > 1) { Thread.Sleep((int)left); left = nextUpdate - s.ElapsedMilliseconds; } nextUpdate += updateTime; } else { nextUpdate = now + updateTime; } if (NetPlay.anyClients || (hibernate == false)) { var start = s.Elapsed; Terraria_Server.Main.Update(s); LastUpdateTime = s.Elapsed - start; } if (collect++ >= 1000) //Every 1000 loops should be less intensive. { if (properties.CollectGarbage) { GC.Collect(); } collect = 0; } /* Check tolled tasks */ Tasks.CheckTasks(); if ((DateTime.Now - backupDate).TotalMinutes >= backupInterval && backup) { backupDate = DateTime.Now; try { BackupManager.AutoPurge(); BackupManager.PerformBackup(); } catch (Exception e) { ProgramLog.Error.Log( String.Format("Error during the backup process.\n{0}", e) ); } } } return; } double serverProcessAverage = 16.666666666666668; double leftOver = 0.0; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); while (!NetPlay.disconnect) { double elapsed = (double)stopwatch.ElapsedMilliseconds; if (elapsed + leftOver >= serverProcessAverage) { leftOver += elapsed - serverProcessAverage; stopwatch.Reset(); stopwatch.Start(); if (leftOver > 1000.0) { leftOver = 1000.0; } if (NetPlay.anyClients || (hibernate == false)) { Terraria_Server.Main.Update(stopwatch); } double num9 = (double)stopwatch.ElapsedMilliseconds + leftOver; if (num9 < serverProcessAverage) { int num10 = (int)(serverProcessAverage - num9) - 1; if (num10 > 1) { Thread.Sleep(num10); if (hibernate && !NetPlay.anyClients) { leftOver = 0.0; Thread.Sleep(10); } } } /* Check tolled tasks */ Tasks.CheckTasks(); if (collect++ >= 1000) //Every 1000 loops should be less intensive. { if (properties.CollectGarbage) { GC.Collect(); } collect = 0; } if ((DateTime.Now - backupDate).TotalMinutes >= backupInterval && backup) { backupDate = DateTime.Now; ProgramLog.Log("Performing backup..."); BackupManager.PerformBackup(); } } Thread.Sleep(0); } #if CATCHERROR_UPDATELOOP } catch (Exception e) { ProgramLog.Log(e, "World update thread crashed"); } #endif }