Lazily generate frozen actor renderables.

Previously actors that could be frozen under fog but were currently visible would be rendered by the frozen under fog system constantly in order to keep a copy of the renderables ready to go for the frozen counterpart when the actor became invisible. Instead, we now delay this extra rendering until the actor actually becomes invisible. This eliminates the wasted rendering to generate renderables that were never used.
This commit is contained in:
RoosterDragon
2015-03-19 19:54:41 +00:00
parent 8d8db8d90d
commit 777a57af62
2 changed files with 28 additions and 20 deletions

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Traits
public object Create(ActorInitializer init) { return new FrozenUnderFog(init, this); }
}
public class FrozenUnderFog : IRenderModifier, IVisibilityModifier, ITick, ITickRender, ISync
public class FrozenUnderFog : IRenderModifier, IVisibilityModifier, ITick, ISync
{
[Sync] public int VisibilityHash;
@@ -104,20 +104,9 @@ namespace OpenRA.Mods.Common.Traits
initialized = true;
}
public void TickRender(WorldRenderer wr, Actor self)
{
if (self.Destroyed || !initialized || !visible.Values.Any(v => v))
return;
var renderables = self.Render(wr).ToArray();
foreach (var player in self.World.Players)
if (visible[player])
frozen[player].Renderables = renderables;
}
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
{
return IsVisible(self, self.World.RenderPlayer) ? r : SpriteRenderable.None;
return IsVisible(self, self.World.RenderPlayer) || (initialized && frozen[self.World.RenderPlayer].IsRendering) ? r : SpriteRenderable.None;
}
}
}