perf: improved networking code to use the new events
This commit is contained in:
@@ -14,7 +14,7 @@ public abstract class LiteNetLibCommunicatorBase : UniverseObject, INetworkCommu
|
||||
{
|
||||
protected readonly NetPacketProcessor netPacketProcessor = new();
|
||||
|
||||
private readonly Dictionary<Type, List<Delegate>> listeners = [];
|
||||
private readonly Dictionary<Type, Event<string, object>> listeners = [];
|
||||
|
||||
public EventBasedNetListener Listener { get; private set; } = null!;
|
||||
public NetManager Manager { get; private set; } = null!;
|
||||
@@ -33,11 +33,10 @@ public abstract class LiteNetLibCommunicatorBase : UniverseObject, INetworkCommu
|
||||
|
||||
protected virtual void OnPacketArrived<T>(T packet, NetPeer peer) where T : INetworkPacket
|
||||
{
|
||||
if (!listeners.TryGetValue(typeof(T), out List<Delegate>? delegates))
|
||||
if (!listeners.TryGetValue(typeof(T), out Event<string, object>? @event))
|
||||
return;
|
||||
|
||||
foreach (Delegate @delegate in delegates)
|
||||
@delegate.DynamicInvoke(packet, peer.Id.ToString());
|
||||
@event.Invoke(peer.Id.ToString(), packet);
|
||||
}
|
||||
|
||||
private void NetworkReceiveEvent(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod)
|
||||
@@ -119,26 +118,28 @@ public abstract class LiteNetLibCommunicatorBase : UniverseObject, INetworkCommu
|
||||
netPacketProcessor.RegisterNestedType(Vector3DNetPacker.Write, Vector3DNetPacker.Read);
|
||||
}
|
||||
|
||||
public INetworkCommunicator SubscribeToPackets<T>(Action<T, string> callback)
|
||||
public INetworkCommunicator SubscribeToPackets<T>(Event<string, T>.EventHandler callback)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
if (!listeners.TryGetValue(type, out List<Delegate>? delegates))
|
||||
if (!listeners.TryGetValue(type, out Event<string, object>? @event))
|
||||
{
|
||||
delegates = [];
|
||||
listeners.Add(type, delegates);
|
||||
@event = new();
|
||||
listeners.Add(type, @event);
|
||||
}
|
||||
|
||||
delegates.Add(callback);
|
||||
@event.AddListener(EventDelegateWrapper(callback));
|
||||
return this;
|
||||
}
|
||||
|
||||
public INetworkCommunicator UnsubscribeFromPackets<T>(Action<T, string> callback)
|
||||
public INetworkCommunicator UnsubscribeFromPackets<T>(Event<string, T>.EventHandler callback)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
if (!listeners.TryGetValue(type, out List<Delegate>? delegates))
|
||||
if (!listeners.TryGetValue(type, out Event<string, object>? @event))
|
||||
return this;
|
||||
|
||||
delegates.Remove(callback);
|
||||
@event.RemoveListener(EventDelegateWrapper(callback));
|
||||
return this;
|
||||
}
|
||||
|
||||
private static Event<string, object>.EventHandler EventDelegateWrapper<T>(Event<string, T>.EventHandler callback) => (sender, @object) => callback.Invoke(sender, (T)@object);
|
||||
}
|
||||
|
Reference in New Issue
Block a user