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.
This commit is contained in:
@@ -33,7 +33,7 @@ namespace OpenRA.Graphics
|
|||||||
readonly WorldRenderer worldRenderer;
|
readonly WorldRenderer worldRenderer;
|
||||||
readonly Map map;
|
readonly Map map;
|
||||||
|
|
||||||
float paletteIndex;
|
readonly PaletteReference palette;
|
||||||
|
|
||||||
public TerrainSpriteLayer(World world, WorldRenderer wr, Sheet sheet, BlendMode blendMode, PaletteReference palette, bool restrictToBounds)
|
public TerrainSpriteLayer(World world, WorldRenderer wr, Sheet sheet, BlendMode blendMode, PaletteReference palette, bool restrictToBounds)
|
||||||
{
|
{
|
||||||
@@ -41,7 +41,7 @@ namespace OpenRA.Graphics
|
|||||||
this.restrictToBounds = restrictToBounds;
|
this.restrictToBounds = restrictToBounds;
|
||||||
Sheet = sheet;
|
Sheet = sheet;
|
||||||
BlendMode = blendMode;
|
BlendMode = blendMode;
|
||||||
paletteIndex = palette.TextureIndex;
|
this.palette = palette;
|
||||||
|
|
||||||
map = world.Map;
|
map = world.Map;
|
||||||
rowStride = 4 * map.MapSize.X;
|
rowStride = 4 * map.MapSize.X;
|
||||||
@@ -50,21 +50,21 @@ namespace OpenRA.Graphics
|
|||||||
vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(vertices.Length);
|
vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(vertices.Length);
|
||||||
emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);
|
emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);
|
||||||
|
|
||||||
wr.PaletteInvalidated += () =>
|
wr.PaletteInvalidated += UpdatePaletteIndices;
|
||||||
{
|
}
|
||||||
paletteIndex = palette.TextureIndex;
|
|
||||||
|
|
||||||
|
void UpdatePaletteIndices()
|
||||||
|
{
|
||||||
// Everything in the layer uses the same palette,
|
// Everything in the layer uses the same palette,
|
||||||
// so we can fix the indices in one pass
|
// so we can fix the indices in one pass
|
||||||
for (var i = 0; i < vertices.Length; i++)
|
for (var i = 0; i < vertices.Length; i++)
|
||||||
{
|
{
|
||||||
var v = vertices[i];
|
var v = vertices[i];
|
||||||
vertices[i] = new Vertex(v.X, v.Y, v.Z, v.U, v.V, paletteIndex, v.C);
|
vertices[i] = new Vertex(v.X, v.Y, v.Z, v.U, v.V, palette.TextureIndex, v.C);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var row = 0; row < map.MapSize.Y; row++)
|
for (var row = 0; row < map.MapSize.Y; row++)
|
||||||
dirtyRows.Add(row);
|
dirtyRows.Add(row);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(CPos cell, Sprite sprite)
|
public void Update(CPos cell, Sprite sprite)
|
||||||
@@ -88,7 +88,7 @@ namespace OpenRA.Graphics
|
|||||||
sprite = emptySprite;
|
sprite = emptySprite;
|
||||||
|
|
||||||
var offset = rowStride * uv.V + 4 * uv.U;
|
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);
|
dirtyRows.Add(uv.V);
|
||||||
}
|
}
|
||||||
@@ -130,6 +130,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
worldRenderer.PaletteInvalidated -= UpdatePaletteIndices;
|
||||||
vertexBuffer.Dispose();
|
vertexBuffer.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user