Merge pull request #8028 from RoosterDragon/cache-traits

Cache traits
This commit is contained in:
Paul Chote
2015-04-26 18:23:15 +12:00
30 changed files with 86 additions and 89 deletions

View File

@@ -83,8 +83,9 @@ namespace OpenRA
}
}
readonly IRenderModifier[] traitsImplementingRenderModifier;
readonly IRender[] traitsImplementingRender;
readonly IRenderModifier[] renderModifiers;
readonly IRender[] renders;
readonly IDisable[] disables;
internal Actor(World world, string name, TypeDictionary initDict)
{
@@ -126,8 +127,9 @@ namespace OpenRA
return new Rectangle(offset.X, offset.Y, size.X, size.Y);
});
traitsImplementingRenderModifier = TraitsImplementing<IRenderModifier>().ToArray();
traitsImplementingRender = TraitsImplementing<IRender>().ToArray();
renderModifiers = TraitsImplementing<IRenderModifier>().ToArray();
renders = TraitsImplementing<IRender>().ToArray();
disables = TraitsImplementing<IDisable>().ToArray();
}
public void Tick()
@@ -143,14 +145,14 @@ namespace OpenRA
public IEnumerable<IRenderable> Render(WorldRenderer wr)
{
var renderables = Renderables(wr);
foreach (var modifier in traitsImplementingRenderModifier)
foreach (var modifier in renderModifiers)
renderables = modifier.ModifyRender(this, wr, renderables);
return renderables;
}
IEnumerable<IRenderable> Renderables(WorldRenderer wr)
{
foreach (var render in traitsImplementingRender)
foreach (var render in renders)
foreach (var renderable in render.Render(this, wr))
yield return renderable;
}
@@ -277,6 +279,14 @@ namespace OpenRA
health.Value.InflictDamage(this, attacker, health.Value.MaxHP, null, true);
}
public bool IsDisabled()
{
foreach (var disable in disables)
if (disable.Disabled)
return true;
return false;
}
#region Scripting interface
Lazy<ScriptActorInterface> luaInterface;

View File

@@ -19,8 +19,8 @@ namespace OpenRA.GameRules
public class ProjectileArgs
{
public WeaponInfo Weapon;
public IEnumerable<int> DamageModifiers;
public IEnumerable<int> InaccuracyModifiers;
public int[] DamageModifiers;
public int[] InaccuracyModifiers;
public int Facing;
public WPos Source;
public Actor SourceActor;

View File

@@ -37,7 +37,7 @@ namespace OpenRA.Traits
if (lobbyShroudFogDisabled)
return;
var disabled = self.TraitsImplementing<IDisable>().Any(d => d.Disabled);
var disabled = self.IsDisabled();
if (cachedLocation != self.Location || cachedDisabled != disabled)
{
cachedLocation = self.Location;

View File

@@ -329,14 +329,6 @@ namespace OpenRA.Traits
void OnObjectiveFailed(Player player, int objectiveID);
}
public static class DisableExts
{
public static bool IsDisabled(this Actor a)
{
return a.TraitsImplementing<IDisable>().Any(d => d.Disabled);
}
}
public interface ILegacyEditorRenderInfo
{
string EditorPalette { get; }