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);