Skip to content

merge #490

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jul 9, 2023
Merged

merge #490

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -130,20 +130,23 @@ public void Awake()
{
if (isAwaking) return;
isAwaking = true;
_skipEnable = true;
LifeCycleMgr.Instance.AddTask(instance, () =>
{
if (_destoryed) return;
var type = instance.Type.ReflectionType;
//直接Invoke
GetMethodInfo(type, "Awake")?.Invoke(instance, ConstMgr.NullObjects);
GetMethodInfo(type, "OnEnable")?.Invoke(instance, ConstMgr.NullObjects);
LifeCycleMgr.Instance.AddAwakeItem(instance, null); //这一帧空出来
//就mono订阅start和update事件
LifeCycleMgr.Instance.AddStartItem(instance, GetMethodInfo(type, "Start"));
LifeCycleMgr.Instance.AddFixedUpdateItem(instance, GetMethodInfo(type, "FixedUpdate"),
gameObject);
LifeCycleMgr.Instance.AddUpdateItem(instance, GetMethodInfo(type, "Update"), gameObject);
gameObject, ()=> enabled);
LifeCycleMgr.Instance.AddUpdateItem(instance, GetMethodInfo(type, "Update"), gameObject,
() => enabled);
LifeCycleMgr.Instance.AddLateUpdateItem(instance, GetMethodInfo(type, "LateUpdate"),
gameObject);
gameObject, () => enabled);

isAwaking = false;
awaked = true;
Expand All @@ -169,13 +172,21 @@ private MethodInfo GetMethodInfo(Type type, string funcName)

IMethod _mOnEnableMethod;
bool _mOnEnableMethodGot;
bool _skipEnable;

void OnEnable()
{
if (!awaked && !isAwaking)
if (!awaked)
{
Awake();
LifeCycleMgr.Instance.ExecuteOnceTask();
_skipEnable = false;
return;
}
if (_skipEnable)
{
_skipEnable = false;
return;
}
LifeCycleMgr.Instance.AddTask(() =>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public static void Initialize()
/// <summary>
/// 最大数量
/// </summary>
private const int MaxSize = 10000;
private const int MaxSize = 30000;

/// <summary>
/// 锁
Expand Down Expand Up @@ -204,16 +204,6 @@ private void OnDestroy()
/// </summary>
private readonly List<IntPtr> _onceTaskItems = new List<IntPtr>(100);

/// <summary>
/// no gc search for awake objs
/// </summary>
private readonly HashSet<IntPtr> _awakeObjs = new HashSet<IntPtr>();

/// <summary>
/// no gc search for start objs
/// </summary>
private readonly HashSet<IntPtr> _startObjs = new HashSet<IntPtr>();

/// <summary>
/// Create lifecycle item
/// </summary>
Expand Down Expand Up @@ -248,7 +238,6 @@ public void AddAwakeItem<T>(T instance, MethodInfo method) where T : class
_awakeItems.Add(GetLifeCycleItem(in ptr, in address,
() => method?.Invoke(instance, ConstMgr.NullObjects),
() => true));
_awakeObjs.Add((IntPtr)ptr);
}

/// <summary>
Expand All @@ -262,7 +251,6 @@ public void AddStartItem<T>(T instance, MethodInfo method) where T : class
_startItems.Add(GetLifeCycleItem(in ptr, in address,
() => method?.Invoke(instance, ConstMgr.NullObjects),
() => true));
_startObjs.Add((IntPtr)ptr);
}

/// <summary>
Expand All @@ -286,12 +274,14 @@ public void AddUpdateItem(object instance, MethodInfo method)
/// <param name="instance"></param>
/// <param name="method"></param>
/// <param name="parent"></param>
public void AddUpdateItem<T>(T instance, MethodInfo method, GameObject parent) where T : class
/// <param name="cond"></param>
public void AddUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> cond = null)
where T : class
{
void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address);
_updateItems.Add(GetLifeCycleItem(in ptr, in address,
() => method?.Invoke(instance, ConstMgr.NullObjects),
() => parent.activeInHierarchy));
() => cond == null ? parent.activeInHierarchy : parent.activeInHierarchy && cond.Invoke()));
}

/// <summary>
Expand Down Expand Up @@ -360,11 +350,14 @@ public void AddLateUpdateItem(object instance, MethodInfo method)
/// <param name="instance"></param>
/// <param name="method"></param>
/// <param name="parent"></param>
public void AddLateUpdateItem<T>(T instance, MethodInfo method, GameObject parent) where T : class
/// <param name="cond"></param>
public void AddLateUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> 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), () => parent.activeInHierarchy));
() => method?.Invoke(instance, ConstMgr.NullObjects),
() => cond == null ? parent.activeInHierarchy : parent.activeInHierarchy && cond.Invoke()));
}

/// <summary>
Expand Down Expand Up @@ -404,11 +397,14 @@ public void AddFixedUpdateItem(object instance, MethodInfo method)
/// <param name="instance"></param>
/// <param name="method"></param>
/// <param name="parent"></param>
public void AddFixedUpdateItem<T>(T instance, MethodInfo method, GameObject parent) where T : class
/// <param name="cond"></param>
public void AddFixedUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> 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), () => parent.activeInHierarchy));
() => method?.Invoke(instance, ConstMgr.NullObjects),
() => cond == null ? parent.activeInHierarchy : parent.activeInHierarchy && cond.Invoke()));
}

/// <summary>
Expand Down Expand Up @@ -621,22 +617,10 @@ private bool InstancesContains(in LifeCycleItem* item)
/// <returns></returns>
private bool IgnoreWithInInstances(in LifeCycleItem* item)
{
return _awakeObjs.Contains(item->InstancePtr)
|| _startObjs.Contains(item->InstancePtr);
return _awakeItems.Contains((IntPtr)item)
|| _startItems.Contains((IntPtr)item);
}

/// <summary>
/// remove obj from instances
/// </summary>
/// <param name="ptr"></param>
/// <returns></returns>
private bool RemoveInstanceIfContains(IntPtr ptr) => _instances.Contains(ptr);

/// <summary>
/// remove obj from instances
/// </summary>
private Predicate<IntPtr> RemoveInstanceIfContainsPredicate => RemoveInstanceIfContains;

/// <summary>
/// execute once task
/// </summary>
Expand Down Expand Up @@ -704,9 +688,6 @@ private void LateUpdate()
}

ExecuteItems(_awakeItems);

//清理
_awakeObjs.RemoveWhere(RemoveInstanceIfContainsPredicate);
}

//如果有start
Expand All @@ -715,9 +696,6 @@ private void LateUpdate()
//确保本帧没处理过这些对象
if (_instances.Count > 0)
{
//调用start,并记录本帧处理的对象
ExecuteItems(_startItems, true, InstancesContains);

cnt = _startItems.Count;
for (i = 0; i < cnt; i++)
{
Expand All @@ -727,22 +705,22 @@ private void LateUpdate()
_instances.Add(item->InstancePtr);
}
}

//调用start,并记录本帧处理的对象
ExecuteItems(_startItems, true, InstancesContains);
}
else
{
ExecuteItems(_startItems);

//调用start,并记录本帧处理的对象
cnt = _startItems.Count;
for (i = 0; i < cnt; i++)
{
item = (LifeCycleItem*)_startItems[i];
_instances.Add(item->InstancePtr);
}
}

//清理
_startObjs.RemoveWhere(RemoveInstanceIfContainsPredicate);
ExecuteItems(_startItems);
}
}

//处理late update
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,13 @@ private static async void DoChange()
if (!Application.isPlaying) return;
await Task.Delay(10);
}

DynamicGI.UpdateEnvironment();
}

var key = Object.FindObjectOfType<InitJEngine>().key;
var initJEngine = GameObject.Find("InitJEngine");
var comp = initJEngine.GetComponent<InitJEngine>();
var key = comp.key;
var k = PlayerPrefs.GetString($"{prefix}.EncryptPassword", "");
if (string.IsNullOrEmpty(k))
{
Expand All @@ -50,7 +53,7 @@ private static async void DoChange()
Setting.GetString(SettingString.Ok), Setting.GetString(SettingString.Ignore));
if (res)
{
Object.FindObjectOfType<InitJEngine>().key = k;
comp.key = k;
}
}
}
Expand Down
23 changes: 17 additions & 6 deletions UnityProject/Assets/Dependencies/JEngine/Templates/MonoAdapter.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,24 @@
{
if (isAwaking) return;
isAwaking = true;
_skipEnable = true;
LifeCycleMgr.Instance.AddTask(instance, () =>
{
if (_destoryed) return;
var type = instance.Type.ReflectionType;
//直接Invoke
GetMethodInfo(type, "Awake")?.Invoke(instance, ConstMgr.NullObjects);
GetMethodInfo(type, "OnEnable")?.Invoke(instance, ConstMgr.NullObjects);
LifeCycleMgr.Instance.AddAwakeItem(instance, null); //这一帧空出来
//就mono订阅start和update事件
LifeCycleMgr.Instance.AddStartItem(instance, GetMethodInfo(type, "Start"));
LifeCycleMgr.Instance.AddFixedUpdateItem(instance, GetMethodInfo(type, "FixedUpdate"),
gameObject);
LifeCycleMgr.Instance.AddUpdateItem(instance, GetMethodInfo(type, "Update"), gameObject);
gameObject, ()=> enabled);
LifeCycleMgr.Instance.AddUpdateItem(instance, GetMethodInfo(type, "Update"), gameObject,
() => enabled);
LifeCycleMgr.Instance.AddLateUpdateItem(instance, GetMethodInfo(type, "LateUpdate"),
gameObject);
gameObject, () => enabled);

isAwaking = false;
awaked = true;
}, () => Application.isPlaying && !_destoryed && gameObject.activeInHierarchy);
Expand All @@ -63,13 +66,21 @@

IMethod _mOnEnableMethod;
bool _mOnEnableMethodGot;

bool _skipEnable;

void OnEnable()
{
if (!awaked && !isAwaking)
if (!awaked)
{
Awake();
LifeCycleMgr.Instance.ExecuteOnceTask();
_skipEnable = false;
return;
}
if (_skipEnable)
{
_skipEnable = false;
return;
}
LifeCycleMgr.Instance.AddTask(() =>
{
Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.