From aa373226afbdb265435a07e358f146eafe243d15 Mon Sep 17 00:00:00 2001 From: muckSponge <5405629+muckSponge@users.noreply.github.com> Date: Wed, 30 Sep 2020 20:01:25 +1000 Subject: [PATCH 1/2] Clean up statics on SubsystemRegistration See #14 --- ...tinuationProcessorGroup.ContinuationProcessor.cs | 5 +++++ .../AsyncManager.ContinuationProcessorGroup.cs | 7 +++++++ .../Assets/UnityAsync/Manager/AsyncManager.cs | 13 ++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.ContinuationProcessor.cs b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.ContinuationProcessor.cs index e9a4bb4..0630406 100644 --- a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.ContinuationProcessor.cs +++ b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.ContinuationProcessor.cs @@ -64,6 +64,11 @@ public void Add(in T cont) AddThreadSafe(cont); } + public void CleanUpStatics() + { + instance = null; + } + // only call in UnitySynchronizationContext - not thread safe [MethodImpl(MethodImplOptions.AggressiveInlining)] void AddFast(in T cont) diff --git a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.cs b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.cs index 94ab54a..9ac3238 100644 --- a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.cs +++ b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.ContinuationProcessorGroup.cs @@ -12,6 +12,7 @@ partial class ContinuationProcessorGroup interface IContinuationProcessor { void Process(); + void CleanUpStatics(); } readonly List processors; @@ -40,6 +41,12 @@ public void Process() for(int i = 0; i < processors.Count; ++i) processors[i].Process(); } + + public void CleanUp() + { + foreach(var p in processors) + p.CleanUpStatics(); + } } } } \ No newline at end of file diff --git a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs index c22478e..952f658 100644 --- a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs +++ b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs @@ -42,9 +42,17 @@ public partial class AsyncManager : MonoBehaviour static int unityThreadId, updateCount, lateCount, fixedCount; static ContinuationProcessorGroup updates, lateUpdates, fixedUpdates; - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] static void Initialize() { + // clear statics + + CurrentFrameCount = updateCount = lateCount = fixedCount = 0; + + updates?.CleanUp(); + lateUpdates?.CleanUp(); + fixedUpdates?.CleanUp(); + unityThreadId = Thread.CurrentThread.ManagedThreadId; UnitySyncContext = SynchronizationContext.Current; @@ -54,6 +62,9 @@ static void Initialize() lateUpdates = new ContinuationProcessorGroup(); fixedUpdates = new ContinuationProcessorGroup(); + if(Instance) + Destroy(Instance); + Instance = new GameObject("Async Manager").AddComponent(); if(!Application.isEditor) // DontDestroyOnLoad can not be called in editor mode DontDestroyOnLoad(Instance); From 1ca2b7de5080d8748ca645879d512aa22da6933d Mon Sep 17 00:00:00 2001 From: muckSponge <5405629+muckSponge@users.noreply.github.com> Date: Wed, 30 Sep 2020 20:02:39 +1000 Subject: [PATCH 2/2] DontDestroyOnLoad AsyncManager instance in editor See #13 --- UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs index 952f658..0e08ec2 100644 --- a/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs +++ b/UnityAsync/Assets/UnityAsync/Manager/AsyncManager.cs @@ -66,8 +66,8 @@ static void Initialize() Destroy(Instance); Instance = new GameObject("Async Manager").AddComponent(); - if(!Application.isEditor) // DontDestroyOnLoad can not be called in editor mode - DontDestroyOnLoad(Instance); + + DontDestroyOnLoad(Instance); } ///