From 44b7a223d8ee364140937464959b5dfe86a2c62a Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Sat, 17 Jan 2026 11:30:39 +0800 Subject: [PATCH] =?UTF-8?q?refactor(architecture):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=88=9D=E5=A7=8B=E5=8C=96=E5=92=8C=E9=94=80?= =?UTF-8?q?=E6=AF=81=E7=AE=A1=E7=90=86=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将_pendingInitializableList重命名为_pendingInitializableSet并改为HashSet类型, 实现组件去重功能 - 新增_pendingInitializableList保持组件注册顺序 - 将_disposables重命名为_disposableSet并改为HashSet类型,避免重复注册 - 新增_disposables列表保持销毁顺序 - 在添加可初始化组件时使用原子去重检查 - 在添加可销毁组件时使用原子去重检查 - 清空操作同步清理对应的Set集合 - 销毁组件时按注册逆序进行销毁,确保依赖关系正确处理 --- GFramework.Core/architecture/Architecture.cs | 41 +++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index 33af54b..a47cd64 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -101,14 +101,24 @@ public abstract class Architecture( #region Fields /// - /// 存储所有待初始化的组件(统一管理) + /// 待初始化组件的去重集合 /// - private readonly HashSet _pendingInitializableList = []; + private readonly HashSet _pendingInitializableSet = []; /// - /// 存储所有需要销毁的组件(统一管理) + /// 存储所有待初始化的组件(统一管理,保持注册顺序) /// - private readonly HashSet _disposables = []; + private readonly List _pendingInitializableList = []; + + /// + /// 可销毁组件的去重集合 + /// + private readonly HashSet _disposableSet = []; + + /// + /// 存储所有需要销毁的组件(统一管理,保持注册逆序销毁) + /// + private readonly List _disposables = []; /// /// 生命周期感知对象列表 @@ -232,8 +242,12 @@ public abstract class Architecture( { if (!_mInitialized) { - _pendingInitializableList.Add(initializable); - _logger.Trace($"Added {component.GetType().Name} to pending initialization queue"); + // 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在) + if (_pendingInitializableSet.Add(initializable)) + { + _pendingInitializableList.Add(initializable); + _logger.Trace($"Added {component.GetType().Name} to pending initialization queue"); + } } else { @@ -244,8 +258,12 @@ public abstract class Architecture( // 处理销毁 if (component is not IDisposable disposable) return; - _disposables.Add(disposable); - _logger.Trace($"Registered {component.GetType().Name} for destruction"); + // 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在) + if (_disposableSet.Add(disposable)) + { + _disposables.Add(disposable); + _logger.Trace($"Registered {component.GetType().Name} for destruction"); + } } /// @@ -316,6 +334,7 @@ public abstract class Architecture( EnterPhase(ArchitecturePhase.AfterSystemInit); _pendingInitializableList.Clear(); + _pendingInitializableSet.Clear(); _logger.Info("All components initialized"); } @@ -358,11 +377,12 @@ public abstract class Architecture( EnterPhase(ArchitecturePhase.Destroying); EventBus.Send(new ArchitectureEvents.ArchitectureDestroyingEvent()); - // 销毁所有实现了 IDisposable 的组件 + // 销毁所有实现了 IDisposable 的组件(按注册逆序销毁) _logger.Info($"Destroying {_disposables.Count} disposable components"); - foreach (var disposable in _disposables) + for (var i = _disposables.Count - 1; i >= 0; i--) { + var disposable = _disposables[i]; try { _logger.Debug($"Destroying component: {disposable.GetType().Name}"); @@ -376,6 +396,7 @@ public abstract class Architecture( } _disposables.Clear(); + _disposableSet.Clear(); // 进入已销毁阶段并发送销毁完成事件 EnterPhase(ArchitecturePhase.Destroyed);