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:
2025-05-31 00:14:43 +03:00
parent 996e61d0ad
commit 61e2761580
58 changed files with 637 additions and 485 deletions

View File

@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
namespace Syntriax.Engine.Core;
public class Event<TSender>
{
private readonly List<EventHandler> listeners = new(8);
public void AddListener(EventHandler listener) => listeners.Add(listener);
public void RemoveListener(EventHandler listener) => listeners.Remove(listener);
public void Clear() => listeners.Clear();
public void Invoke(TSender argument)
{
for (int i = 0; i < listeners.Count; i++)
try { listeners[i].Invoke(argument); }
catch (Exception exception)
{
string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({argument})";
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
}
}
public delegate void EventHandler(TSender sender);
}
public class Event<TSender, TArguments>
{
private readonly List<EventHandler> listeners = new(8);
public void AddListener(EventHandler listener) => listeners.Add(listener);
public void RemoveListener(EventHandler listener) => listeners.Remove(listener);
public void Clear() => listeners.Clear();
public void Invoke(TSender sender, TArguments args)
{
for (int i = 0; i < listeners.Count; i++)
try { listeners[i].Invoke(sender, args); }
catch (Exception exception)
{
string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, args)})";
Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}");
}
}
public delegate void EventHandler(TSender sender, TArguments args);
}