Merge pull request #8226 from pchote/actor-disposal

Dispose traits when destroying an actor.
This commit is contained in:
Oliver Brakmann
2015-06-02 19:33:22 +02:00
54 changed files with 138 additions and 81 deletions

View File

@@ -123,6 +123,9 @@ namespace OpenRA.Graphics
public void Draw()
{
if (World.WorldActor.Disposed)
return;
RefreshPalette();
if (World.Type == WorldType.Shellmap && !Game.Settings.Game.ShowShellmap)
@@ -140,7 +143,7 @@ namespace OpenRA.Graphics
// added for contrails
foreach (var a in World.ActorsWithTrait<IPostRender>())
if (a.Actor.IsInWorld && !a.Actor.Destroyed)
if (a.Actor.IsInWorld && !a.Actor.Disposed)
a.Trait.RenderAfterWorld(this, a.Actor);
var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null;
@@ -154,7 +157,7 @@ namespace OpenRA.Graphics
Game.Renderer.DisableScissor();
var overlayRenderables = World.Selection.Actors.Where(a => !a.Destroyed)
var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed)
.SelectMany(a => a.TraitsImplementing<IPostRenderSelection>())
.SelectMany(t => t.RenderAfterWorld(this));
@@ -174,7 +177,7 @@ namespace OpenRA.Graphics
if (World.Type == WorldType.Regular && Game.Settings.Game.AlwaysShowStatusBars)
{
foreach (var g in World.Actors.Where(a => !a.Destroyed
foreach (var g in World.Actors.Where(a => !a.Disposed
&& a.HasTrait<Selectable>()
&& !World.FogObscures(a)
&& !World.Selection.Actors.Contains(a)))
@@ -273,6 +276,12 @@ namespace OpenRA.Graphics
public void Dispose()
{
// HACK: Disposing the world from here violates ownership
// but the WorldRenderer lifetime matches the disposal
// behavior we want for the world, and the root object setup
// is so horrible that doing it properly would be a giant mess.
World.Dispose();
palette.Dispose();
Theater.Dispose();
terrainRenderer.Dispose();