From 9f728b287bec680a8cf38970fc31a2761d1fc4ca Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Sun, 1 Nov 2015 17:21:42 +0000 Subject: [PATCH] Remove event handlers to CellEntryChanged when done. Several classes would attach event handlers to the Map which would live longer then they did. Detaching them when no longer needed allows the GC to reclaim them. --- OpenRA.Game/Graphics/TerrainRenderer.cs | 8 ++++++-- OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs | 2 ++ OpenRA.Mods.Common/Traits/World/ResourceLayer.cs | 2 ++ OpenRA.Mods.Common/Widgets/RadarWidget.cs | 7 +++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index 1f6a123159..a6011527b0 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -18,11 +18,13 @@ namespace OpenRA.Graphics readonly TerrainSpriteLayer terrain; readonly Theater theater; readonly CellLayer mapTiles; + readonly CellLayer mapHeight; public TerrainRenderer(World world, WorldRenderer wr) { theater = wr.Theater; mapTiles = world.Map.MapTiles.Value; + mapHeight = world.Map.MapHeight.Value; terrain = new TerrainSpriteLayer(world, wr, theater.Sheet, BlendMode.Alpha, wr.Palette("terrain"), wr.World.Type != WorldType.Editor); @@ -30,8 +32,8 @@ namespace OpenRA.Graphics foreach (var cell in world.Map.AllCells) UpdateCell(cell); - world.Map.MapTiles.Value.CellEntryChanged += UpdateCell; - world.Map.MapHeight.Value.CellEntryChanged += UpdateCell; + mapTiles.CellEntryChanged += UpdateCell; + mapHeight.CellEntryChanged += UpdateCell; } public void UpdateCell(CPos cell) @@ -48,6 +50,8 @@ namespace OpenRA.Graphics public void Dispose() { + mapTiles.CellEntryChanged -= UpdateCell; + mapHeight.CellEntryChanged -= UpdateCell; terrain.Dispose(); } } diff --git a/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs b/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs index 3224e6b4aa..56fc6dd836 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorResourceLayer.cs @@ -207,6 +207,8 @@ namespace OpenRA.Mods.Common.Traits foreach (var kv in spriteLayers.Values) kv.Dispose(); + Map.MapResources.Value.CellEntryChanged -= UpdateCell; + disposed = true; } } diff --git a/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs b/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs index f11e9c9e95..570deb906d 100644 --- a/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/ResourceLayer.cs @@ -294,6 +294,8 @@ namespace OpenRA.Mods.Common.Traits foreach (var kv in spriteLayers.Values) kv.Dispose(); + RenderContent.CellEntryChanged -= UpdateSpriteLayers; + disposed = true; } diff --git a/OpenRA.Mods.Common/Widgets/RadarWidget.cs b/OpenRA.Mods.Common/Widgets/RadarWidget.cs index 99c1164f7a..4c194f6321 100644 --- a/OpenRA.Mods.Common/Widgets/RadarWidget.cs +++ b/OpenRA.Mods.Common/Widgets/RadarWidget.cs @@ -442,5 +442,12 @@ namespace OpenRA.Mods.Common.Widgets var v = (int)((p.Y - mapRect.Y) / previewScale) + world.Map.Bounds.Top; return new MPos(u, v).ToCPos(world.Map); } + + public override void Removed() + { + base.Removed(); + world.Map.MapTiles.Value.CellEntryChanged -= UpdateTerrainCell; + world.Map.CustomTerrain.CellEntryChanged -= UpdateTerrainCell; + } } }