diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index aac4761267..8b8a671a48 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -187,13 +187,8 @@ namespace OpenRA Cursor.SetCursor(null); BeforeGameStart(); - Map map; - - using (new PerfTimer("PrepareMap")) - map = ModData.PrepareMap(mapUID); - using (new PerfTimer("NewWorld")) - OrderManager.World = new World(ModData, map, OrderManager, type); + OrderManager.World = new World(mapUID, ModData, OrderManager, type); OrderManager.World.GameOver += FinishBenchmark; diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index 43555d0b25..f5c70dc60a 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -149,7 +149,7 @@ namespace OpenRA } } - public class Map : IReadOnlyFileSystem + public class Map : IReadOnlyFileSystem, IDisposable { public const int SupportedMapFormat = 11; public const int CurrentMapFormat = 12; @@ -1417,5 +1417,10 @@ namespace OpenRA return modData.Translation.GetString(key, args); } + + public void Dispose() + { + Sequences.Dispose(); + } } } diff --git a/OpenRA.Game/Map/MapCache.cs b/OpenRA.Game/Map/MapCache.cs index 0f04e4dfae..e665cfac73 100644 --- a/OpenRA.Game/Map/MapCache.cs +++ b/OpenRA.Game/Map/MapCache.cs @@ -214,12 +214,6 @@ namespace OpenRA yield return mapPackage; } - public IEnumerable EnumerateMapsWithoutCaching(MapClassification classification = MapClassification.System) - { - foreach (var mapPackage in EnumerateMapPackagesWithoutCaching(classification)) - yield return new Map(modData, mapPackage); - } - public void QueryRemoteMapDetails(string repositoryUrl, IEnumerable uids, Action mapDetailsReceived = null, Action mapQueryFailed = null) { var queryUids = uids.Distinct() diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index d284303c83..8b83e5bf61 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -188,12 +188,13 @@ namespace OpenRA bool wasLoadingGameSave; - internal World(ModData modData, Map map, OrderManager orderManager, WorldType type) + internal World(string mapUID, ModData modData, OrderManager orderManager, WorldType type) { this.modData = modData; Type = type; OrderManager = orderManager; - Map = map; + using (new PerfTimer("PrepareMap")) + Map = modData.PrepareMap(mapUID); if (string.IsNullOrEmpty(modData.Manifest.DefaultOrderGenerator)) throw new InvalidDataException("mod.yaml must define a DefaultOrderGenerator"); @@ -212,7 +213,7 @@ namespace OpenRA SharedRandom = new MersenneTwister(orderManager.LobbyInfo.GlobalSettings.RandomSeed); LocalRandom = new MersenneTwister(); - ModelCache = modData.ModelSequenceLoader.CacheModels(map, modData, map.Rules.ModelSequences); + ModelCache = modData.ModelSequenceLoader.CacheModels(Map, modData, Map.Rules.ModelSequences); var worldActorType = type == WorldType.Editor ? SystemActors.EditorWorld : SystemActors.World; WorldActor = CreateActor(worldActorType.ToString(), new TypeDictionary()); @@ -241,7 +242,7 @@ namespace OpenRA MapTitle = Map.Title }; - RulesContainTemporaryBlocker = map.Rules.Actors.Any(a => a.Value.HasTraitInfo()); + RulesContainTemporaryBlocker = Map.Rules.Actors.Any(a => a.Value.HasTraitInfo()); gameSettings = Game.Settings.Game; } @@ -612,6 +613,8 @@ namespace OpenRA if (Type == WorldType.Shellmap) OrderManager.Dispose(); + Map.Dispose(); + Game.FinishBenchmark(); } diff --git a/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs b/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs index 1bc54cb031..52be685e5a 100644 --- a/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs +++ b/OpenRA.Mods.Common/UtilityCommands/CheckYaml.cs @@ -97,8 +97,8 @@ namespace OpenRA.Mods.Common.UtilityCommands if (package == null) continue; - var testMap = new Map(modData, package); - TestMap(testMap, modData); + using (var testMap = new Map(modData, package)) + TestMap(testMap, modData); } if (errors > 0) diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs index 35241e32ae..251f3c3b97 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs @@ -70,6 +70,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic Action afterSave = uid => { + map.Dispose(); Game.LoadEditor(uid); Ui.CloseWindow();