性能优化与检测, 防止假死机
This commit is contained in:
@@ -309,6 +309,11 @@ namespace Demo
|
||||
|
||||
#region LoadSubScript
|
||||
|
||||
internal static int LoadingTaskCoroutineCount { get; set; } = 0;
|
||||
internal readonly static LinkedList<IEnumerator> WaitingTaskForLoadingCoroutine = new();
|
||||
private readonly static WaitForEndOfFrame WaitForEndOfFrameInstance = new();
|
||||
private const int MaxLoadingCoroutine = 100;
|
||||
|
||||
/// <summary>
|
||||
/// 创建基于子脚本的实例对象
|
||||
/// </summary>
|
||||
@@ -345,7 +350,22 @@ namespace Demo
|
||||
Childs.Add(child);
|
||||
|
||||
// Load Child Script
|
||||
ConventionUtility.StartCoroutine(child.ParseFromScriptFile2Expr(file));
|
||||
IEnumerator Foo()
|
||||
{
|
||||
// 缓存并延迟运行
|
||||
yield return WaitForEndOfFrameInstance;
|
||||
yield return child.ParseFromScriptFile2Expr(file);
|
||||
LoadingTaskCoroutineCount--;
|
||||
|
||||
}
|
||||
child.IsParseScript2Expr = true;
|
||||
WaitingTaskForLoadingCoroutine.AddLast(Foo());
|
||||
while (LoadingTaskCoroutineCount < MaxLoadingCoroutine && WaitingTaskForLoadingCoroutine.Count > 0)
|
||||
{
|
||||
LoadingTaskCoroutineCount++;
|
||||
ConventionUtility.StartCoroutine(WaitingTaskForLoadingCoroutine.First.Value);
|
||||
WaitingTaskForLoadingCoroutine.RemoveFirst();
|
||||
}
|
||||
|
||||
return child;
|
||||
}
|
||||
@@ -481,6 +501,12 @@ namespace Demo
|
||||
while (this.IsParseScript2Expr)
|
||||
{
|
||||
yield return null;
|
||||
while (LoadingTaskCoroutineCount < MaxLoadingCoroutine && WaitingTaskForLoadingCoroutine.Count > 0)
|
||||
{
|
||||
LoadingTaskCoroutineCount++;
|
||||
ConventionUtility.StartCoroutine(WaitingTaskForLoadingCoroutine.First.Value);
|
||||
WaitingTaskForLoadingCoroutine.RemoveFirst();
|
||||
}
|
||||
}
|
||||
yield return DoSomethingDuringApplyScript();
|
||||
// 增数
|
||||
|
||||
Reference in New Issue
Block a user