+
+ if (incrementallyDisposedQueue.Count > 0)
+ {
+ if (!incrementalDisposeSupported ||
+ (!fullCollectRequested && !ProcessorController.Instance.Initialized))
+ {
+ // Full Dispose if IncrementalDisposeSupported is false, or ProcessorController is not initialized yet.
+ fullCollectRequested = true;
+ }
+ ProcessDisposablesIncrementally();
+ }
+ }
+
+ private void ProcessDisposablesIncrementally()
+ {
+ var disposeCount = fullCollectRequested ? incrementallyDisposedQueue.Count
+ : Math.Min(incrementallyDisposedQueue.Count, Math.Max(minimumIncrementalCount, incrementallyDisposedQueue.Count * minimumIncrementalRate / 100));
+
+ DebugFileLogging.Instance.WriteLog((fullCollectRequested ? "Fully" : "Incrementally") + $" dispose {disposeCount} disposables. Will remained disposables count is {incrementallyDisposedQueue.Count - disposeCount}.\n");
+
+ fullCollectRequested = false;
+
+ // Dispose item from end, due to the performance issue.
+ while (disposeCount > 0 && incrementallyDisposedQueue.Count > 0)
+ {
+ --disposeCount;
+ var disposable = incrementallyDisposedQueue.Last();
+ incrementallyDisposedQueue.RemoveAt(incrementallyDisposedQueue.Count - 1);
+
+ DebugFileLogging.Instance.WriteLog($"disposable.Dispose(); type={disposable.GetType().FullName}, hash={disposable.GetHashCode()}");
+ disposable.Dispose();
+ }
+
+ if (incrementallyDisposedQueue.Count > 0)
+ {
+ if (ProcessorController.Instance.Initialized && !processorRegistered)
+ {
+ processorRegistered = true;
+ ProcessorController.Instance.ProcessorOnceEvent += TriggerProcessDisposables;
+ ProcessorController.Instance.Awake();
+ }
+ }
+
+ DebugFileLogging.Instance.WriteLog($"Incrementally dispose finished.\n");