diff --git a/UnityProject/Assets/TEngine/Runtime/Core/GameEvent/ActorEventDispatcher.cs b/UnityProject/Assets/TEngine/Runtime/Core/GameEvent/ActorEventDispatcher.cs index e446596fd..6ba41996a 100644 --- a/UnityProject/Assets/TEngine/Runtime/Core/GameEvent/ActorEventDispatcher.cs +++ b/UnityProject/Assets/TEngine/Runtime/Core/GameEvent/ActorEventDispatcher.cs @@ -60,6 +60,11 @@ public void DestroyAllEventListener() while (itr.MoveNext()) { var kv = itr.Current; + List list = kv.Value; + foreach (var eventRegInfo in list) + { + EventRegInfo.Release(eventRegInfo); + } kv.Value.Clear(); } @@ -97,6 +102,7 @@ private void CheckDelayDelete(int eventId) { Log.Info("remove delay delete eventId[{0}]", eventId); listListener[i] = listListener[^1]; + EventRegInfo.Release(listListener[i]); listListener.RemoveAt(listListener.Count - 1); i--; } @@ -437,7 +443,7 @@ private void AddEventListenerImp(int eventId, Delegate listener, object owner) return; } - listListener.Add(new EventRegInfo(listener, owner)); + listListener.Add(EventRegInfo.Alloc(listener, owner)); } /// @@ -469,6 +475,7 @@ public void RemoveAllListenerByOwner(object owner) else { list[i] = list[^1]; + EventRegInfo.Release(list[i]); list.RemoveAt(list.Count - 1); i--; } @@ -587,17 +594,17 @@ public void Clear() /// /// 事件注册信息。 /// - public class EventRegInfo + public class EventRegInfo : IMemory { /// /// 事件回调。 /// - public readonly Delegate Callback; + public Delegate Callback; /// /// 事件持有者。 /// - public readonly object Owner; + public object Owner; /// /// 事件是否删除。 @@ -610,5 +617,28 @@ public EventRegInfo(Delegate callback, object owner) Owner = owner; IsDeleted = false; } + + public EventRegInfo() { } + + public void Clear() + { + Callback = null; + Owner = null; + IsDeleted = false; + } + + public static EventRegInfo Alloc(Delegate callback, object owner) + { + EventRegInfo ret = MemoryPool.Acquire(); + ret.Callback = callback; + ret.Owner = owner; + ret.IsDeleted = false; + return ret; + } + + public static void Release(EventRegInfo eventRegInfo) + { + MemoryPool.Release(eventRegInfo); + } } } \ No newline at end of file