From 6971d6dbbb74fd19c440f3ffa1a7007bd9edf7de Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 5 Mar 2011 22:15:03 +1300 Subject: [PATCH] remove another 50M/min of delegates being constructed as part of the render --- OpenRA.Game/Actor.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 611469105b..9c5b258b7f 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -60,10 +60,13 @@ namespace OpenRA return new float2(si.Bounds[0], si.Bounds[1]); // auto size from render - var firstSprite = TraitsImplementing().SelectMany(x => x.Render(this)).FirstOrDefault(); + var firstSprite = TraitsImplementing().SelectMany(ApplyIRender).FirstOrDefault(); if (firstSprite.Sprite == null) return float2.Zero; return firstSprite.Sprite.size * firstSprite.Scale; }); + + ApplyIRender = x => x.Render(this); + ApplyRenderModifier = (m, p) => p.ModifyRender(this, m); } public void Tick() @@ -80,13 +83,16 @@ namespace OpenRA get { return currentActivity == null; } } - OpenRA.FileFormats.Lazy Size; - + OpenRA.FileFormats.Lazy Size; + + // note: these delegates are cached to avoid massive allocation. + Func> ApplyIRender; + Func, IRenderModifier, IEnumerable> ApplyRenderModifier; public IEnumerable Render() { - var mods = TraitsImplementing(); - var sprites = TraitsImplementing().SelectMany(x => x.Render(this)); - return mods.Aggregate(sprites, (m, p) => p.ModifyRender(this, m)); + var mods = TraitsImplementing(); + var sprites = TraitsImplementing().SelectMany(ApplyIRender); + return mods.Aggregate(sprites, ApplyRenderModifier); } // When useAltitude = true, the bounding box is extended