diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 6ce39f5328..fd055406ae 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -626,7 +626,7 @@ namespace OpenRA static void LogicTick() { - delayedActions.PerformActions(RunTime); + PerformDelayedActions(); if (OrderManager.Connection.ConnectionState != lastConnectionState) { @@ -639,6 +639,11 @@ namespace OpenRA InnerLogicTick(worldRenderer.World.OrderManager); } + public static void PerformDelayedActions() + { + delayedActions.PerformActions(RunTime); + } + public static void TakeScreenshot() { takeScreenshot = true; diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 6a89c91fe3..97b67902d6 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -215,6 +215,10 @@ namespace OpenRA.Server delayedActions.PerformActions(0); + // PERF: Dedicated servers need to drain the action queue to remove references blocking the GC from cleaning up disposed objects. + if (dedicated) + Game.PerformDelayedActions(); + foreach (var t in serverTraits.WithInterface()) t.Tick(this); diff --git a/OpenRA.Server/Program.cs b/OpenRA.Server/Program.cs index 64f0d69ffe..052765ec81 100644 --- a/OpenRA.Server/Program.cs +++ b/OpenRA.Server/Program.cs @@ -56,17 +56,17 @@ namespace OpenRA.Server var mods = new InstalledMods(modSearchPaths, explicitModPaths); - // HACK: The engine code *still* assumes that Game.ModData is set - var modData = Game.ModData = new ModData(mods[modID], mods); - modData.MapCache.LoadMaps(); - - settings.Map = modData.MapCache.ChooseInitialMap(settings.Map, new MersenneTwister()); - Console.WriteLine("[{0}] Starting dedicated server for mod: {1}", DateTime.Now.ToString(settings.TimestampFormat), modID); while (true) { - var server = new Server(new IPEndPoint(IPAddress.Any, settings.ListenPort), settings, modData, true); + // HACK: The engine code *still* assumes that Game.ModData is set + var modData = Game.ModData = new ModData(mods[modID], mods); + modData.MapCache.LoadMaps(); + settings.Map = modData.MapCache.ChooseInitialMap(settings.Map, new MersenneTwister()); + + var server = new Server(new IPEndPoint(IPAddress.Any, settings.ListenPort), settings, modData, true); + GC.Collect(); while (true) { Thread.Sleep(1000); @@ -78,6 +78,7 @@ namespace OpenRA.Server } } + modData.Dispose(); Console.WriteLine("[{0}] Starting a new server instance...", DateTime.Now.ToString(settings.TimestampFormat)); } }