From 3db8bde1c21281715089e938320fc36b66b7a2e4 Mon Sep 17 00:00:00 2001 From: ninemine <1371605831@qq.com> Date: Tue, 9 Dec 2025 18:00:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EAvoid=E6=8B=86=E5=88=86?= =?UTF-8?q?=E5=8D=8F=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Convention/[Runtime]/Config.cs | 57 +++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/Convention/[Runtime]/Config.cs b/Convention/[Runtime]/Config.cs index 94b6f1f..de04ac6 100644 --- a/Convention/[Runtime]/Config.cs +++ b/Convention/[Runtime]/Config.cs @@ -8,6 +8,7 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading; using Convention.WindowsUI; +using Demo.Game; using UnityEditor; #if UNITY_EDITOR using UnityEditor.Build; @@ -1271,7 +1272,11 @@ namespace Convention #endif public static void InitExtensionEnv() { - UnityEngine.Application.quitting += () => CoroutineStarter = null; + UnityEngine.Application.quitting += () => + { + GameObject.Destroy(s_CoroutineStarter.gameObject); + s_CoroutineStarter = null; + }; InitExtensionEnvCalls(); GlobalConfig.InitExtensionEnv(); @@ -1285,27 +1290,65 @@ namespace Convention return MainThreadID == Thread.CurrentThread.ManagedThreadId; } - private static CoroutineMonoStarterUtil CoroutineStarter; + private static CoroutineMonoStarterUtil s_CoroutineStarter; + private static CoroutineMonoStarterUtil CoroutineStarter + { + get + { + if (s_CoroutineStarter == null) + { + s_CoroutineStarter = new GameObject($"{nameof(ConventionUtility)}-{nameof(CoroutineStarter)}").AddComponent(); + } + return s_CoroutineStarter; + } + } + public static GameObject Singleton => CoroutineStarter.gameObject; private class CoroutineMonoStarterUtil : MonoBehaviour { + internal float waitClock; private void Update() { + waitClock = Time.realtimeSinceStartup; MainThreadID = Thread.CurrentThread.ManagedThreadId; } private void OnDestroy() { - CoroutineStarter = null; + s_CoroutineStarter = null; + } + } + /// + /// 包装即将用于协程的迭代器成为一个防止假死机的迭代器 + /// + /// + /// + public static IEnumerator AvoidFakeStop(IEnumerator ir, float fps = 5) + { + Stack loadingTask = new(); + loadingTask.Push(ir); + float maxWaitClock = 1 / fps; + while (loadingTask.Count > 0) + { + // 防止大量无延迟函数的使用导致假死机 + if (Time.realtimeSinceStartup - CoroutineStarter.waitClock > maxWaitClock) + { + yield return null; + } + if (loadingTask.Peek().MoveNext()) + { + if (loadingTask.Peek().Current is IEnumerator next) + loadingTask.Push(next); + } + else + { + loadingTask.Pop(); + } } } public static Coroutine StartCoroutine(IEnumerator coroutine) { - if (CoroutineStarter == null) - { - CoroutineStarter = new GameObject($"{nameof(ConventionUtility)}-{nameof(CoroutineStarter)}").AddComponent(); - } return CoroutineStarter.StartCoroutine(coroutine); } public static void CloseCoroutine(Coroutine coroutine)