Skip to content

Commit 1c26081

Browse files
Merge pull request #500 from JasonXuDeveloper/development
Development
2 parents eec3c03 + 3792bd4 commit 1c26081

File tree

8 files changed

+121
-52
lines changed

8 files changed

+121
-52
lines changed

UnityProject/Assets/Dependencies/JEngine/Core/Manager/LifeCycleMgr.cs

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ private void Awake()
163163
/// </summary>
164164
private void OnDestroy()
165165
{
166+
ExecuteItems(_onDestroyTaskItems);
166167
UnsafeUtility.Free(ItemList, Allocator.Persistent);
167168
UnsafeUtility.Free(UsageList, Allocator.Persistent);
168169
GC.RemoveMemoryPressure(sizeof(LifeCycleItem) * MaxSize);
@@ -204,6 +205,11 @@ private void OnDestroy()
204205
/// </summary>
205206
private readonly List<IntPtr> _onceTaskItems = new List<IntPtr>(100);
206207

208+
/// <summary>
209+
/// All on destory task methods
210+
/// </summary>
211+
private readonly List<IntPtr> _onDestroyTaskItems = new List<IntPtr>(100);
212+
207213
/// <summary>
208214
/// no gc search for awake objs
209215
/// </summary>
@@ -287,7 +293,8 @@ public void AddUpdateItem(object instance, MethodInfo method)
287293
/// <param name="method"></param>
288294
/// <param name="parent"></param>
289295
/// <param name="cond"></param>
290-
public void AddUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> cond = null) where T : class
296+
public void AddUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> cond = null)
297+
where T : class
291298
{
292299
void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address);
293300
_updateItems.Add(GetLifeCycleItem(in ptr, in address,
@@ -362,11 +369,12 @@ public void AddLateUpdateItem(object instance, MethodInfo method)
362369
/// <param name="method"></param>
363370
/// <param name="parent"></param>
364371
/// <param name="cond"></param>
365-
public void AddLateUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> cond = null) where T : class
372+
public void AddLateUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> cond = null)
373+
where T : class
366374
{
367375
void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address);
368376
_lateUpdateItems.Add(GetLifeCycleItem(in ptr, in address,
369-
() => method?.Invoke(instance, ConstMgr.NullObjects),
377+
() => method?.Invoke(instance, ConstMgr.NullObjects),
370378
() => cond == null ? parent.activeInHierarchy : parent.activeInHierarchy && cond.Invoke()));
371379
}
372380

@@ -408,11 +416,12 @@ public void AddFixedUpdateItem(object instance, MethodInfo method)
408416
/// <param name="method"></param>
409417
/// <param name="parent"></param>
410418
/// <param name="cond"></param>
411-
public void AddFixedUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> cond = null) where T : class
419+
public void AddFixedUpdateItem<T>(T instance, MethodInfo method, GameObject parent, Func<bool> cond = null)
420+
where T : class
412421
{
413422
void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address);
414423
_fixedUpdateItems.Add(GetLifeCycleItem(in ptr, in address,
415-
() => method?.Invoke(instance, ConstMgr.NullObjects),
424+
() => method?.Invoke(instance, ConstMgr.NullObjects),
416425
() => cond == null ? parent.activeInHierarchy : parent.activeInHierarchy && cond.Invoke()));
417426
}
418427

@@ -465,7 +474,8 @@ public Guid AddTask(Action action, Func<bool> condition)
465474
/// <param name="instance"></param>
466475
/// <param name="action"></param>
467476
/// <returns></returns>
468-
public void AddTask<T>(T instance, Action action) => AddTask(action, () => true);
477+
public void AddTask<T>(T instance, Action action) where T : class
478+
=> AddTask(instance, action, () => true);
469479

470480
/// <summary>
471481
/// Add a task that will call once in the main thread when condition is true
@@ -480,6 +490,55 @@ public void AddTask<T>(T instance, Action action, Func<bool> condition) where T
480490
_onceTaskItems.Add(GetLifeCycleItem(in ptr, in address, action, condition));
481491
}
482492

493+
/// <summary>
494+
/// Add a task that will call once in the main thread when application is quitting
495+
/// </summary>
496+
/// <param name="action"></param>
497+
/// <returns></returns>
498+
public Guid AddOnDestroyTask(Action action) => AddOnDestroyTask(action, () => true);
499+
500+
/// <summary>
501+
/// Add a task that will call once in the main thread when condition is true when application is quitting
502+
/// </summary>
503+
/// <param name="action"></param>
504+
/// <param name="condition"></param>
505+
/// <returns></returns>
506+
public Guid AddOnDestroyTask(Action action, Func<bool> condition)
507+
{
508+
Guid guid = Guid.NewGuid();
509+
var guidIdent = new IntPtr(guid.GetHashCode());
510+
while (_onDestroyTaskItems.Exists(i => ((LifeCycleItem*)i)->InstancePtr == guidIdent))
511+
{
512+
guid = Guid.NewGuid();
513+
guidIdent = new IntPtr(guid.GetHashCode());
514+
}
515+
516+
_onDestroyTaskItems.Add(GetLifeCycleItem((void*)guidIdent, 0, action, condition));
517+
return guid;
518+
}
519+
520+
/// <summary>
521+
/// Add a task that will call once in the main thread when application is quitting
522+
/// </summary>
523+
/// <param name="instance"></param>
524+
/// <param name="action"></param>
525+
/// <returns></returns>
526+
public void AddOnDestroyTask<T>(T instance, Action action) where T : class
527+
=> AddOnDestroyTask(instance, action, () => true);
528+
529+
/// <summary>
530+
/// Add a task that will call once in the main thread when condition is true when application is quitting
531+
/// </summary>
532+
/// <param name="instance"></param>
533+
/// <param name="action"></param>
534+
/// <param name="condition"></param>
535+
/// <returns></returns>
536+
public void AddOnDestroyTask<T>(T instance, Action action, Func<bool> condition) where T : class
537+
{
538+
void* ptr = UnsafeUtility.PinGCObjectAndGetAddress(instance, out var address);
539+
_onDestroyTaskItems.Add(GetLifeCycleItem(in ptr, in address, action, condition));
540+
}
541+
483542
/// <summary>
484543
/// Remove a task that will call once in the main thread
485544
/// </summary>
@@ -717,7 +776,7 @@ private void LateUpdate()
717776
_instances.Add(item->InstancePtr);
718777
}
719778
}
720-
779+
721780
//调用start,并记录本帧处理的对象
722781
ExecuteItems(_startItems, true, InstancesContains,
723782
iterate: il => _startObjs.Remove(il.InstancePtr));
@@ -731,7 +790,7 @@ private void LateUpdate()
731790
item = (LifeCycleItem*)_startItems[i];
732791
_instances.Add(item->InstancePtr);
733792
}
734-
793+
735794
ExecuteItems(_startItems, iterate: il => _startObjs.Remove(il.InstancePtr));
736795
}
737796
}

UnityProject/Assets/Dependencies/JEngine/Editor/JEngineTools/EditorUpdates/ChangeScene.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,17 @@ private static async void DoChange()
2828
var op = SceneManager.LoadSceneAsync(name);
2929
while (SceneManager.GetActiveScene().path != path)
3030
{
31-
if (!Application.isPlaying) return;
3231
EditorUtility.DisplayProgressBar("JEngine", Setting.GetString(SettingString.JumpToStartUpScene), op.progress);
3332
await Task.Delay(100);
3433
}
3534
EditorUtility.ClearProgressBar();
3635
DynamicGI.UpdateEnvironment();
3736
}
3837

39-
var comp = Object.FindFirstObjectByType<InitJEngine>();
38+
var comp = Object.FindObjectOfType<InitJEngine>();
4039
if (comp == null)
4140
{
42-
Debug.LogWarning("没有找到InitJEngine脚本,无法检验秘钥是否正确");
41+
// Debug.LogWarning("没有找到InitJEngine脚本,无法检验秘钥是否正确");
4342
return;
4443
}
4544
var key = comp.key;

UnityProject/Assets/Dependencies/JEngine/Editor/JEngineTools/EditorUpdates/SetData.cs

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ internal static class SetData
1111
{
1212
public static bool HasAdded;
1313
private static string _path = "JEngine.proj";
14-
private static JEngineProjData _data = new JEngineProjData();
14+
private static JEngineProjData _data;
1515

1616
public static void UpdateData(Action<JEngineProjData> func)
1717
{
@@ -23,54 +23,59 @@ public static void UpdateData(Action<JEngineProjData> func)
2323

2424
public static string GetPrefix()
2525
{
26-
//看看文件存不存在,不存在就创建和提示
27-
string fPath = Path.Combine(Application.dataPath, _path);
28-
if (!File.Exists(fPath))
26+
if (_data == null)
2927
{
3028
_data = new JEngineProjData();
31-
//兼容老版本
32-
bool flag = false;
33-
if (File.Exists(Path.Combine(Application.dataPath, "JEngine.lock")))
29+
//看看文件存不存在,不存在就创建和提示
30+
string fPath = Path.Combine(Application.dataPath, _path);
31+
if (!File.Exists(fPath))
3432
{
35-
_data.Prefix = File.ReadAllText(Path.Combine(Application.dataPath, "JEngine.lock"));
36-
_data.EncryptPassword = PlayerPrefs.GetString($"{_data.Prefix}.EncryptPassword", "");
37-
File.Delete(Path.Combine(Application.dataPath, "JEngine.lock"));
38-
}
39-
else
40-
{
41-
_data.Prefix = Guid.NewGuid().ToString();
42-
flag = true;
43-
}
44-
Span<byte> data = stackalloc byte[_data.Size()];
45-
_data.AsBinary(ref data);
46-
File.WriteAllBytes(fPath, data.ToArray());
47-
if (flag)
48-
{
49-
//提示看文档
50-
Debug.LogError(Setting.GetString(SettingString.NoticeText));
51-
EditorUtility.DisplayDialog(Setting.GetString(SettingString.Notice),
52-
Setting.GetString(SettingString.NoticeText), Setting.GetString(SettingString.Done));
53-
if (Setting.Language == JEngineLanguage.English)
33+
//兼容老版本
34+
bool flag = false;
35+
if (File.Exists(Path.Combine(Application.dataPath, "JEngine.lock")))
5436
{
55-
Application.OpenURL("https://docs.xgamedev.net/documents/0.8/");
37+
_data.Prefix = File.ReadAllText(Path.Combine(Application.dataPath, "JEngine.lock"));
38+
_data.EncryptPassword = PlayerPrefs.GetString($"{_data.Prefix}.EncryptPassword", "");
39+
File.Delete(Path.Combine(Application.dataPath, "JEngine.lock"));
5640
}
5741
else
5842
{
59-
Application.OpenURL("https://docs.xgamedev.net/zh/documents/0.8/");
43+
_data.Prefix = Guid.NewGuid().ToString();
44+
flag = true;
45+
}
46+
47+
Span<byte> data = stackalloc byte[_data.Size()];
48+
_data.AsBinary(ref data);
49+
File.WriteAllBytes(fPath, data.ToArray());
50+
if (flag)
51+
{
52+
//提示看文档
53+
Debug.LogError(Setting.GetString(SettingString.NoticeText));
54+
EditorUtility.DisplayDialog(Setting.GetString(SettingString.Notice),
55+
Setting.GetString(SettingString.NoticeText), Setting.GetString(SettingString.Done));
56+
if (Setting.Language == JEngineLanguage.English)
57+
{
58+
Application.OpenURL("https://docs.xgamedev.net/documents/0.8/");
59+
}
60+
else
61+
{
62+
Application.OpenURL("https://docs.xgamedev.net/zh/documents/0.8/");
63+
}
6064
}
65+
66+
InjectDefineSymbol();
67+
}
68+
else
69+
{
70+
//读取文件
71+
Span<byte> data = File.ReadAllBytes(fPath);
72+
_data.FromBinary(ref data);
6173
}
62-
InjectDefineSymbol();
63-
}
64-
else
65-
{
66-
//读取文件
67-
Span<byte> data = File.ReadAllBytes(fPath);
68-
_data.FromBinary(ref data);
6974
}
7075

7176
return _data.Prefix;
7277
}
73-
78+
7479
public static void Update()
7580
{
7681
string prefix = GetPrefix();
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

UnityProject/HotUpdateScripts/JEngine/Core/JBehaviour.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ static JBehaviour()
7676
{
7777
CoroutineMgr.Instance.StartCoroutine(JBehavioursLoop());
7878
});
79+
LifeCycleMgr.Instance.AddOnDestroyTask(() =>
80+
{
81+
foreach (var jb in JBehaviours.Values.ToList())
82+
{
83+
if (!jb._hidden && !jb._paused)
84+
{
85+
jb.Destroy();
86+
}
87+
}
88+
});
7989
}
8090

8191
/// <summary>
@@ -86,7 +96,6 @@ private static IEnumerator JBehavioursLoop()
8696
Stopwatch sw = new Stopwatch();
8797
for (;;)
8898
{
89-
if (!Application.isPlaying) break;
9099
yield return ConstMgr.WaitFor1Sec;
91100
int cnt = LoopJBehaviours.Count;
92101
for (int i = 0; i < cnt; i++)
@@ -575,10 +584,7 @@ private void Destroy()
575584
JBehaviours.Remove(_instanceID);
576585
GameObjectJBehaviours.Remove(_gameObject);
577586
_gameObject = null;
578-
if (Application.isPlaying)
579-
{
580-
End();
581-
}
587+
End();
582588
}
583589

584590

0 commit comments

Comments
 (0)