WorldRenderer, replace foreach ActorsWithTraits with ApplyToActorsWithTrait. #18798.

This commit is contained in:
Vapre
2021-07-23 22:20:00 +02:00
committed by abcdefg30
parent 00356b8bbd
commit 83357af14c
2 changed files with 23 additions and 17 deletions

View File

@@ -151,14 +151,14 @@ namespace OpenRA.Graphics
// PERF: Avoid LINQ. // PERF: Avoid LINQ.
void GenerateOverlayRenderables() void GenerateOverlayRenderables()
{ {
foreach (var a in World.ActorsWithTrait<IRenderAboveShroud>()) World.ApplyToActorsWithTrait<IRenderAboveShroud>((actor, trait) =>
{ {
if (!a.Actor.IsInWorld || a.Actor.Disposed || (a.Trait.SpatiallyPartitionable && !onScreenActors.Contains(a.Actor))) if (!actor.IsInWorld || actor.Disposed || (trait.SpatiallyPartitionable && !onScreenActors.Contains(actor)))
continue; return;
foreach (var renderable in a.Trait.RenderAboveShroud(a.Actor, this)) foreach (var renderable in trait.RenderAboveShroud(actor, this))
preparedOverlayRenderables.Add(renderable.PrepareRender(this)); preparedOverlayRenderables.Add(renderable.PrepareRender(this));
} });
foreach (var a in World.Selection.Actors) foreach (var a in World.Selection.Actors)
{ {
@@ -193,14 +193,14 @@ namespace OpenRA.Graphics
// PERF: Avoid LINQ. // PERF: Avoid LINQ.
void GenerateAnnotationRenderables() void GenerateAnnotationRenderables()
{ {
foreach (var a in World.ActorsWithTrait<IRenderAnnotations>()) World.ApplyToActorsWithTrait<IRenderAnnotations>((actor, trait) =>
{ {
if (!a.Actor.IsInWorld || a.Actor.Disposed || (a.Trait.SpatiallyPartitionable && !onScreenActors.Contains(a.Actor))) if (!actor.IsInWorld || actor.Disposed || (trait.SpatiallyPartitionable && !onScreenActors.Contains(actor)))
continue; return;
foreach (var renderAnnotation in a.Trait.RenderAnnotations(a.Actor, this)) foreach (var renderAnnotation in trait.RenderAnnotations(actor, this))
preparedAnnotationRenderables.Add(renderAnnotation.PrepareRender(this)); preparedAnnotationRenderables.Add(renderAnnotation.PrepareRender(this));
} });
foreach (var a in World.Selection.Actors) foreach (var a in World.Selection.Actors)
{ {
@@ -272,15 +272,16 @@ namespace OpenRA.Graphics
if (enableDepthBuffer) if (enableDepthBuffer)
Game.Renderer.ClearDepthBuffer(); Game.Renderer.ClearDepthBuffer();
foreach (var a in World.ActorsWithTrait<IRenderAboveWorld>()) World.ApplyToActorsWithTrait<IRenderAboveWorld>((actor, trait) =>
if (a.Actor.IsInWorld && !a.Actor.Disposed) {
a.Trait.RenderAboveWorld(a.Actor, this); if (actor.IsInWorld && !actor.Disposed)
trait.RenderAboveWorld(actor, this);
});
if (enableDepthBuffer) if (enableDepthBuffer)
Game.Renderer.ClearDepthBuffer(); Game.Renderer.ClearDepthBuffer();
foreach (var a in World.ActorsWithTrait<IRenderShroud>()) World.ApplyToActorsWithTrait<IRenderShroud>((actor, trait) => trait.RenderShroud(this));
a.Trait.RenderShroud(this);
if (enableDepthBuffer) if (enableDepthBuffer)
Game.Renderer.Context.DisableDepthBuffer(); Game.Renderer.Context.DisableDepthBuffer();

View File

@@ -427,7 +427,7 @@ namespace OpenRA
foreach (var a in actors.Values) foreach (var a in actors.Values)
a.Tick(); a.Tick();
ApplyToActorsWithTraitTimed<ITick>((Actor actor, ITick trait) => trait.Tick(actor), "Trait"); ApplyToActorsWithTraitTimed<ITick>((actor, trait) => trait.Tick(actor), "Trait");
effects.DoTimed(e => e.Tick(this), "Effect"); effects.DoTimed(e => e.Tick(this), "Effect");
} }
@@ -439,7 +439,7 @@ namespace OpenRA
// For things that want to update their render state once per tick, ignoring pause state // For things that want to update their render state once per tick, ignoring pause state
public void TickRender(WorldRenderer wr) public void TickRender(WorldRenderer wr)
{ {
ApplyToActorsWithTraitTimed<ITickRender>((Actor actor, ITickRender trait) => trait.TickRender(wr, actor), "Render"); ApplyToActorsWithTraitTimed<ITickRender>((actor, trait) => trait.TickRender(wr, actor), "Render");
ScreenMap.TickRender(); ScreenMap.TickRender();
} }
@@ -503,6 +503,11 @@ namespace OpenRA
TraitDict.ApplyToActorsWithTraitTimed<T>(action, text); TraitDict.ApplyToActorsWithTraitTimed<T>(action, text);
} }
public void ApplyToActorsWithTrait<T>(Action<Actor, T> action)
{
TraitDict.ApplyToActorsWithTrait<T>(action);
}
public IEnumerable<Actor> ActorsHavingTrait<T>() public IEnumerable<Actor> ActorsHavingTrait<T>()
{ {
return TraitDict.ActorsHavingTrait<T>(); return TraitDict.ActorsHavingTrait<T>();