From c562b8c51eb472634ea0f996a870b1bb356d9357 Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Sun, 1 Nov 2015 17:15:23 +0000 Subject: [PATCH] Detach event handlers on dispose in TerrainSpriteLayer. The WorldRenderer outlives the TerrainSpriteLayer and thus keeps it alive longer than expected via the event handler. We detach it to allow the GC to reclaim it. --- OpenRA.Game/Graphics/TerrainSpriteLayer.cs | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/OpenRA.Game/Graphics/TerrainSpriteLayer.cs b/OpenRA.Game/Graphics/TerrainSpriteLayer.cs index 81c07151de..153f7eca24 100644 --- a/OpenRA.Game/Graphics/TerrainSpriteLayer.cs +++ b/OpenRA.Game/Graphics/TerrainSpriteLayer.cs @@ -33,7 +33,7 @@ namespace OpenRA.Graphics readonly WorldRenderer worldRenderer; readonly Map map; - float paletteIndex; + readonly PaletteReference palette; public TerrainSpriteLayer(World world, WorldRenderer wr, Sheet sheet, BlendMode blendMode, PaletteReference palette, bool restrictToBounds) { @@ -41,7 +41,7 @@ namespace OpenRA.Graphics this.restrictToBounds = restrictToBounds; Sheet = sheet; BlendMode = blendMode; - paletteIndex = palette.TextureIndex; + this.palette = palette; map = world.Map; rowStride = 4 * map.MapSize.X; @@ -50,21 +50,21 @@ namespace OpenRA.Graphics vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(vertices.Length); emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha); - wr.PaletteInvalidated += () => + wr.PaletteInvalidated += UpdatePaletteIndices; + } + + void UpdatePaletteIndices() + { + // Everything in the layer uses the same palette, + // so we can fix the indices in one pass + for (var i = 0; i < vertices.Length; i++) { - paletteIndex = palette.TextureIndex; + var v = vertices[i]; + vertices[i] = new Vertex(v.X, v.Y, v.Z, v.U, v.V, palette.TextureIndex, v.C); + } - // Everything in the layer uses the same palette, - // so we can fix the indices in one pass - for (var i = 0; i < vertices.Length; i++) - { - var v = vertices[i]; - vertices[i] = new Vertex(v.X, v.Y, v.Z, v.U, v.V, paletteIndex, v.C); - } - - for (var row = 0; row < map.MapSize.Y; row++) - dirtyRows.Add(row); - }; + for (var row = 0; row < map.MapSize.Y; row++) + dirtyRows.Add(row); } public void Update(CPos cell, Sprite sprite) @@ -88,7 +88,7 @@ namespace OpenRA.Graphics sprite = emptySprite; var offset = rowStride * uv.V + 4 * uv.U; - Util.FastCreateQuad(vertices, pos, sprite, paletteIndex, offset, sprite.Size); + Util.FastCreateQuad(vertices, pos, sprite, palette.TextureIndex, offset, sprite.Size); dirtyRows.Add(uv.V); } @@ -130,6 +130,7 @@ namespace OpenRA.Graphics public void Dispose() { + worldRenderer.PaletteInvalidated -= UpdatePaletteIndices; vertexBuffer.Dispose(); } }