perf: regular events to custom events

This commit is contained in:
2025-05-30 12:58:08 +03:00
parent b1b5af94d3
commit 846aa75dd5
42 changed files with 342 additions and 198 deletions

View File

@@ -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, UniverseTime> OnPreUpdate { get; set; } = new();
public Event<IUniverse, UniverseTime> OnUpdate { get; set; } = new();
public Event<IUniverse, UniverseTime> OnPostUpdate { get; set; } = new();
public Event<IUniverse> OnPreDraw { get; set; } = new();
public Event<IUniverse> OnDraw { get; set; } = new();
public Event<IUniverse> OnPostDraw { get; set; } = new();
public Event<IUniverse, IUniverseObject> OnUniverseObjectRegistered { get; set; } = new();
public Event<IUniverse, IUniverseObject> OnUniverseObjectUnRegistered { get; set; } = new();
public Event<IUniverse, float> OnTimeScaleChanged { get; set; } = new();
public event IUniverse.UniverseObjectRegisteredEventHandler? OnUniverseObjectRegistered = null;
public event IUniverse.UniverseObjectUnRegisteredEventHandler? OnUniverseObjectUnRegistered = null;
public event IUniverse.TimeScaleChangedEventHandler? OnTimeScaleChanged = null;
private readonly Action<IInitializable> cachedOnUniverseObjectFinalize = null!;
private readonly Action<IUniverseObject, IUniverse> cachedOnUniverseObjectExitedUniverse = null!;
private readonly List<IUniverseObject> _universeObjects = new(Constants.UNIVERSE_OBJECTS_SIZE_INITIAL);
private float _timeScale = 1f;
public Universe()
{
cachedOnUniverseObjectFinalize = OnUniverseObjectFinalize;
cachedOnUniverseObjectExitedUniverse = OnUniverseObjectExitedUniverse;
}
public IReadOnlyList<IUniverseObject> UniverseObjects => _universeObjects;
public UniverseTime Time { get; private set; } = new();
@@ -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(cachedOnUniverseObjectFinalize);
universeObject.OnExitedUniverse.AddListener(cachedOnUniverseObjectExitedUniverse);
if (!universeObject.Initialize())
throw new Exception($"{universeObject.Name} can't be initialized");
@@ -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(cachedOnUniverseObjectFinalize);
universeObject.OnExitedUniverse.RemoveListener(cachedOnUniverseObjectExitedUniverse);
for (int i = universeObject.Children.Count - 1; i >= 0; i--)
Remove(universeObject.Children[i]);