perf!: events refactored throughout all the project to use Event<> class
All delegate events are refactored to use the Event<TSender> and Event<TSender, TArgument> for performance issues regarding delegate events creating garbage, also this gives us better control on event invocation since C# Delegates did also create unnecessary garbage during Delegate.DynamicInvoke
This commit is contained in:
@@ -7,21 +7,28 @@ namespace Syntriax.Engine.Core;
|
||||
[System.Diagnostics.DebuggerDisplay("UniverseObject Count: {_universeObjects.Count}")]
|
||||
public class Universe : BaseEntity, IUniverse
|
||||
{
|
||||
public event IUniverse.UpdateEventHandler? OnPreUpdate = null;
|
||||
public event IUniverse.UpdateEventHandler? OnUpdate = null;
|
||||
public event IUniverse.UpdateEventHandler? OnPostUpdate = null;
|
||||
public event IUniverse.DrawEventHandler? OnPreDraw = null;
|
||||
public event IUniverse.DrawEventHandler? OnDraw = null;
|
||||
public event IUniverse.DrawEventHandler? OnPostDraw = null;
|
||||
public Event<IUniverse, IUniverse.UpdateArguments> OnPreUpdate { get; } = new();
|
||||
public Event<IUniverse, IUniverse.UpdateArguments> OnUpdate { get; } = new();
|
||||
public Event<IUniverse, IUniverse.UpdateArguments> OnPostUpdate { get; } = new();
|
||||
public Event<IUniverse> OnPreDraw { get; } = new();
|
||||
public Event<IUniverse> OnDraw { get; } = new();
|
||||
public Event<IUniverse> OnPostDraw { get; } = new();
|
||||
public Event<IUniverse, IUniverse.UniverseObjectRegisteredArguments> OnUniverseObjectRegistered { get; } = new();
|
||||
public Event<IUniverse, IUniverse.UniverseObjectUnRegisteredArguments> OnUniverseObjectUnRegistered { get; } = new();
|
||||
public Event<IUniverse, IUniverse.TimeScaleChangedArguments> OnTimeScaleChanged { get; } = new();
|
||||
|
||||
public event IUniverse.UniverseObjectRegisteredEventHandler? OnUniverseObjectRegistered = null;
|
||||
public event IUniverse.UniverseObjectUnRegisteredEventHandler? OnUniverseObjectUnRegistered = null;
|
||||
|
||||
public event IUniverse.TimeScaleChangedEventHandler? OnTimeScaleChanged = null;
|
||||
private readonly Event<IInitializable>.EventHandler delegateOnUniverseObjectFinalize = null!;
|
||||
private readonly Event<IUniverseObject, IUniverseObject.ExitedUniverseArguments>.EventHandler delegateOnUniverseObjectExitedUniverse = null!;
|
||||
|
||||
private readonly List<IUniverseObject> _universeObjects = new(Constants.UNIVERSE_OBJECTS_SIZE_INITIAL);
|
||||
private float _timeScale = 1f;
|
||||
|
||||
public Universe()
|
||||
{
|
||||
delegateOnUniverseObjectFinalize = OnUniverseObjectFinalize;
|
||||
delegateOnUniverseObjectExitedUniverse = OnUniverseObjectExitedUniverse;
|
||||
}
|
||||
|
||||
public IReadOnlyList<IUniverseObject> UniverseObjects => _universeObjects;
|
||||
|
||||
public UniverseTime Time { get; private set; } = new();
|
||||
@@ -37,7 +44,7 @@ public class Universe : BaseEntity, IUniverse
|
||||
|
||||
float previousTimeScale = _timeScale;
|
||||
_timeScale = value;
|
||||
OnTimeScaleChanged?.Invoke(this, previousTimeScale);
|
||||
OnTimeScaleChanged?.Invoke(this, new(previousTimeScale));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,8 +53,8 @@ public class Universe : BaseEntity, IUniverse
|
||||
if (_universeObjects.Contains(universeObject))
|
||||
throw new Exception($"{nameof(IUniverseObject)} named {universeObject.Name} is already registered to the {nameof(Universe)}.");
|
||||
|
||||
universeObject.OnFinalized += OnUniverseObjectFinalize;
|
||||
universeObject.OnExitedUniverse += OnUniverseObjectExitedUniverse;
|
||||
universeObject.OnFinalized.AddListener(delegateOnUniverseObjectFinalize);
|
||||
universeObject.OnExitedUniverse.AddListener(delegateOnUniverseObjectExitedUniverse);
|
||||
|
||||
if (!universeObject.Initialize())
|
||||
throw new Exception($"{universeObject.Name} can't be initialized");
|
||||
@@ -60,7 +67,7 @@ public class Universe : BaseEntity, IUniverse
|
||||
if (!universeObject.EnterUniverse(this))
|
||||
throw new Exception($"{universeObject.Name} can't enter the universe");
|
||||
|
||||
OnUniverseObjectRegistered?.Invoke(this, universeObject);
|
||||
OnUniverseObjectRegistered?.Invoke(this, new(universeObject));
|
||||
}
|
||||
|
||||
public T InstantiateUniverseObject<T>(params object?[]? args) where T : class, IUniverseObject
|
||||
@@ -81,8 +88,8 @@ public class Universe : BaseEntity, IUniverse
|
||||
if (!_universeObjects.Contains(universeObject))
|
||||
throw new Exception($"{nameof(IUniverseObject)} named {universeObject.Name} is not registered to the {nameof(Universe)}.");
|
||||
|
||||
universeObject.OnFinalized -= OnUniverseObjectFinalize;
|
||||
universeObject.OnExitedUniverse -= OnUniverseObjectExitedUniverse;
|
||||
universeObject.OnFinalized.RemoveListener(delegateOnUniverseObjectFinalize);
|
||||
universeObject.OnExitedUniverse.RemoveListener(delegateOnUniverseObjectExitedUniverse);
|
||||
|
||||
for (int i = universeObject.Children.Count - 1; i >= 0; i--)
|
||||
Remove(universeObject.Children[i]);
|
||||
@@ -95,7 +102,7 @@ public class Universe : BaseEntity, IUniverse
|
||||
if (!universeObject.Finalize())
|
||||
throw new Exception($"{universeObject.Name} can't be finalized");
|
||||
|
||||
OnUniverseObjectUnRegistered?.Invoke(this, universeObject);
|
||||
OnUniverseObjectUnRegistered?.Invoke(this, new(universeObject));
|
||||
}
|
||||
|
||||
protected override void InitializeInternal()
|
||||
@@ -118,9 +125,9 @@ public class Universe : BaseEntity, IUniverse
|
||||
UnscaledTime = engineTime;
|
||||
Time = new(TimeSpan.FromTicks((long)(Time.TimeSinceStart.Ticks + engineTime.DeltaSpan.Ticks * TimeScale)), TimeSpan.FromTicks((long)(engineTime.DeltaSpan.Ticks * TimeScale)));
|
||||
|
||||
OnPreUpdate?.Invoke(this, Time);
|
||||
OnUpdate?.Invoke(this, Time);
|
||||
OnPostUpdate?.Invoke(this, Time);
|
||||
OnPreUpdate?.Invoke(this, new(Time));
|
||||
OnUpdate?.Invoke(this, new(Time));
|
||||
OnPostUpdate?.Invoke(this, new(Time));
|
||||
}
|
||||
|
||||
public void Draw()
|
||||
@@ -138,7 +145,7 @@ public class Universe : BaseEntity, IUniverse
|
||||
Remove(universeObject);
|
||||
}
|
||||
|
||||
private void OnUniverseObjectExitedUniverse(IUniverseObject sender, IUniverse universe)
|
||||
private void OnUniverseObjectExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments args)
|
||||
{
|
||||
if (sender is IUniverseObject universeObject)
|
||||
Remove(universeObject);
|
||||
|
Reference in New Issue
Block a user