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.
This commit is contained in:
@@ -18,11 +18,13 @@ namespace OpenRA.Graphics
|
|||||||
readonly TerrainSpriteLayer terrain;
|
readonly TerrainSpriteLayer terrain;
|
||||||
readonly Theater theater;
|
readonly Theater theater;
|
||||||
readonly CellLayer<TerrainTile> mapTiles;
|
readonly CellLayer<TerrainTile> mapTiles;
|
||||||
|
readonly CellLayer<byte> mapHeight;
|
||||||
|
|
||||||
public TerrainRenderer(World world, WorldRenderer wr)
|
public TerrainRenderer(World world, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
theater = wr.Theater;
|
theater = wr.Theater;
|
||||||
mapTiles = world.Map.MapTiles.Value;
|
mapTiles = world.Map.MapTiles.Value;
|
||||||
|
mapHeight = world.Map.MapHeight.Value;
|
||||||
|
|
||||||
terrain = new TerrainSpriteLayer(world, wr, theater.Sheet, BlendMode.Alpha,
|
terrain = new TerrainSpriteLayer(world, wr, theater.Sheet, BlendMode.Alpha,
|
||||||
wr.Palette("terrain"), wr.World.Type != WorldType.Editor);
|
wr.Palette("terrain"), wr.World.Type != WorldType.Editor);
|
||||||
@@ -30,8 +32,8 @@ namespace OpenRA.Graphics
|
|||||||
foreach (var cell in world.Map.AllCells)
|
foreach (var cell in world.Map.AllCells)
|
||||||
UpdateCell(cell);
|
UpdateCell(cell);
|
||||||
|
|
||||||
world.Map.MapTiles.Value.CellEntryChanged += UpdateCell;
|
mapTiles.CellEntryChanged += UpdateCell;
|
||||||
world.Map.MapHeight.Value.CellEntryChanged += UpdateCell;
|
mapHeight.CellEntryChanged += UpdateCell;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateCell(CPos cell)
|
public void UpdateCell(CPos cell)
|
||||||
@@ -48,6 +50,8 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
mapTiles.CellEntryChanged -= UpdateCell;
|
||||||
|
mapHeight.CellEntryChanged -= UpdateCell;
|
||||||
terrain.Dispose();
|
terrain.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,6 +207,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
foreach (var kv in spriteLayers.Values)
|
foreach (var kv in spriteLayers.Values)
|
||||||
kv.Dispose();
|
kv.Dispose();
|
||||||
|
|
||||||
|
Map.MapResources.Value.CellEntryChanged -= UpdateCell;
|
||||||
|
|
||||||
disposed = true;
|
disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -294,6 +294,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
foreach (var kv in spriteLayers.Values)
|
foreach (var kv in spriteLayers.Values)
|
||||||
kv.Dispose();
|
kv.Dispose();
|
||||||
|
|
||||||
|
RenderContent.CellEntryChanged -= UpdateSpriteLayers;
|
||||||
|
|
||||||
disposed = true;
|
disposed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -442,5 +442,12 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
var v = (int)((p.Y - mapRect.Y) / previewScale) + world.Map.Bounds.Top;
|
var v = (int)((p.Y - mapRect.Y) / previewScale) + world.Map.Bounds.Top;
|
||||||
return new MPos(u, v).ToCPos(world.Map);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user