diff --git a/UnityProject/Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs b/UnityProject/Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs index c3f17761..d6ef9487 100644 --- a/UnityProject/Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs +++ b/UnityProject/Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs @@ -204,6 +204,16 @@ private void OnDestroy() /// private readonly List _onceTaskItems = new List(100); + /// + /// no gc search for awake objs + /// + private readonly HashSet _awakeObjs = new HashSet(); + + /// + /// no gc search for start objs + /// + private readonly HashSet _startObjs = new HashSet(); + /// /// Create lifecycle item /// @@ -238,6 +248,7 @@ public void AddAwakeItem(T instance, MethodInfo method) where T : class _awakeItems.Add(GetLifeCycleItem(in ptr, in address, () => method?.Invoke(instance, ConstMgr.NullObjects), () => true)); + _awakeObjs.Add((IntPtr)ptr); } /// @@ -251,6 +262,7 @@ public void AddStartItem(T instance, MethodInfo method) where T : class _startItems.Add(GetLifeCycleItem(in ptr, in address, () => method?.Invoke(instance, ConstMgr.NullObjects), () => true)); + _startObjs.Add((IntPtr)ptr); } /// @@ -275,8 +287,7 @@ public void AddUpdateItem(object instance, MethodInfo method) /// /// /// - public void AddUpdateItem(T instance, MethodInfo method, GameObject parent, Func cond = null) - where T : class + public void AddUpdateItem(T instance, MethodInfo method, GameObject parent, Func cond = null) where T : class { void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address); _updateItems.Add(GetLifeCycleItem(in ptr, in address, @@ -351,12 +362,11 @@ public void AddLateUpdateItem(object instance, MethodInfo method) /// /// /// - public void AddLateUpdateItem(T instance, MethodInfo method, GameObject parent, Func cond = null) - where T : class + public void AddLateUpdateItem(T instance, MethodInfo method, GameObject parent, Func cond = null) where T : class { void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address); _lateUpdateItems.Add(GetLifeCycleItem(in ptr, in address, - () => method?.Invoke(instance, ConstMgr.NullObjects), + () => method?.Invoke(instance, ConstMgr.NullObjects), () => cond == null ? parent.activeInHierarchy : parent.activeInHierarchy && cond.Invoke())); } @@ -398,12 +408,11 @@ public void AddFixedUpdateItem(object instance, MethodInfo method) /// /// /// - public void AddFixedUpdateItem(T instance, MethodInfo method, GameObject parent, Func cond = null) - where T : class + public void AddFixedUpdateItem(T instance, MethodInfo method, GameObject parent, Func cond = null) where T : class { void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address); _fixedUpdateItems.Add(GetLifeCycleItem(in ptr, in address, - () => method?.Invoke(instance, ConstMgr.NullObjects), + () => method?.Invoke(instance, ConstMgr.NullObjects), () => cond == null ? parent.activeInHierarchy : parent.activeInHierarchy && cond.Invoke())); } @@ -509,8 +518,9 @@ public void RemoveTask(T instance) where T : class /// /// /// + /// private void ExecuteItems(List items, in bool removeAfterInvoke = true, - IgnoreCondFunc ignoreCondition = null) + IgnoreCondFunc ignoreCondition = null, Action iterate = null) { int count = items.Count; //遍历 @@ -556,6 +566,7 @@ private void ExecuteItems(List items, in bool removeAfterInvoke = true, try { item->Action?.Invoke(); + iterate?.Invoke(*item); } catch (Exception ex) { @@ -617,8 +628,8 @@ private bool InstancesContains(in LifeCycleItem* item) /// private bool IgnoreWithInInstances(in LifeCycleItem* item) { - return _awakeItems.Contains((IntPtr)item) - || _startItems.Contains((IntPtr)item); + return _awakeObjs.Contains(item->InstancePtr) + || _startObjs.Contains(item->InstancePtr); } /// @@ -687,7 +698,8 @@ private void LateUpdate() _instances.Add(item->InstancePtr); } - ExecuteItems(_awakeItems); + ExecuteItems(_awakeItems, + iterate: il => _awakeObjs.Remove(il.InstancePtr)); } //如果有start @@ -705,9 +717,10 @@ private void LateUpdate() _instances.Add(item->InstancePtr); } } - + //调用start,并记录本帧处理的对象 - ExecuteItems(_startItems, true, InstancesContains); + ExecuteItems(_startItems, true, InstancesContains, + iterate: il => _startObjs.Remove(il.InstancePtr)); } else { @@ -718,8 +731,8 @@ private void LateUpdate() item = (LifeCycleItem*)_startItems[i]; _instances.Add(item->InstancePtr); } - - ExecuteItems(_startItems); + + ExecuteItems(_startItems, iterate: il => _startObjs.Remove(il.InstancePtr)); } } diff --git a/UnityProject/Assets/Dependencies/JEngine/Editor/JEngineTools/EditorUpdates/ChangeScene.cs b/UnityProject/Assets/Dependencies/JEngine/Editor/JEngineTools/EditorUpdates/ChangeScene.cs index 4848ab48..091598a0 100644 --- a/UnityProject/Assets/Dependencies/JEngine/Editor/JEngineTools/EditorUpdates/ChangeScene.cs +++ b/UnityProject/Assets/Dependencies/JEngine/Editor/JEngineTools/EditorUpdates/ChangeScene.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Threading.Tasks; using JEngine.Core; using UnityEditor; @@ -35,8 +36,11 @@ private static async void DoChange() DynamicGI.UpdateEnvironment(); } - var initJEngine = GameObject.Find("InitJEngine"); - var comp = initJEngine.GetComponent(); + var comp = Object.FindFirstObjectByType(); + if (comp == null) + { + Debug.LogWarning("没有找到InitJEngine脚本,无法检验秘钥是否正确"); + } var key = comp.key; var k = PlayerPrefs.GetString($"{prefix}.EncryptPassword", ""); if (string.IsNullOrEmpty(k))