# AbstractArchitecture基类 **本文档引用的文件** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs) - [ArchitectureAnchor.cs](file://GFramework.Godot/architecture/ArchitectureAnchor.cs) - [AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs) - [IGodotModule.cs](file://GFramework.Godot/architecture/IGodotModule.cs) - [godot-integration.md](file://docs/tutorials/godot-integration.md) - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 AbstractArchitecture是GFramework中Godot平台特定的架构基类,它继承自Core模块的Architecture基类,专门为Godot引擎提供了生命周期管理和模块化架构支持。该类通过与Godot场景树的深度集成,实现了架构组件的自动生命周期管理和资源清理。 该基类的核心价值在于: - **Godot生命周期绑定**:通过ArchitectureAnchor节点将架构与Godot场景树生命周期紧密绑定 - **模块化架构系统**:支持IGodotModule接口的模块化扩展机制 - **自动资源管理**:确保架构销毁时所有相关资源得到正确清理 - **类型安全的模块安装**:提供强类型约束的模块安装和管理机制 ## 项目结构 GFramework采用分层架构设计,AbstractArchitecture位于Godot特定层: ```mermaid graph TB subgraph "Core架构层" CoreArch[Architecture基类] CoreContext[ArchitectureContext] CoreServices[ArchitectureServices] end subgraph "Godot架构层" AbstractArch[AbstractArchitecture] ArchAnchor[ArchitectureAnchor] GodotModule[IGodotModule] AbstractGodotMod[AbstractGodotModule] end subgraph "应用层" GameArch[游戏架构实现] GameModule[游戏模块] end CoreArch --> AbstractArch AbstractArch --> ArchAnchor AbstractArch --> GodotModule GodotModule --> AbstractGodotMod AbstractArch --> GameArch GodotModule --> GameModule ``` **图表来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L14-L19) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L23-L29) - [ArchitectureAnchor.cs](file://GFramework.Godot/architecture/ArchitectureAnchor.cs#L9-L35) **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L1-L140) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L569) ## 核心组件 ### 主要特性概述 AbstractArchitecture继承了Core架构的所有核心功能,并增加了Godot特定的扩展能力: | 特性 | 描述 | 实现位置 | |------|------|----------| | 架构初始化 | 完整的架构初始化流程,包括模块安装 | [Init方法](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L56-L62) | | Godot生命周期绑定 | 通过ArchitectureAnchor节点绑定场景树生命周期 | [AttachToGodotLifecycle方法](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L74-L91) | | 模块安装系统 | 支持IGodotModule接口的模块安装和管理 | [InstallGodotModule方法](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L100-L119) | | 资源清理机制 | 架构销毁时自动清理所有已安装模块 | [Destroy方法](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L127-L139) | | 根节点访问 | 提供受保护的ArchitectureRoot属性访问 | [ArchitectureRoot属性](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L49) | **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L14-L139) ## 架构概览 AbstractArchitecture的架构设计体现了良好的分层原则和依赖倒置: ```mermaid classDiagram class Architecture { <> +Initialize() +InitializeAsync() +Destroy() +RegisterSystem() +RegisterModel() +RegisterUtility() #Init() #EnterPhase() } class AbstractArchitecture { <> -_extensions : IGodotModule[] -_anchor : ArchitectureAnchor -_architectureAnchorName : string -_destroyed : bool +ArchitectureRoot : Node #Init() #InstallModules() -AttachToGodotLifecycle() +InstallGodotModule() +Destroy() } class ArchitectureAnchor { -_onExit : Action +Bind() +_ExitTree() } class IGodotModule { <> +Node : Node +Install() +OnAttach() +OnDetach() } class AbstractGodotModule { <> +Node : Node +Install() +OnAttach() +OnDetach() +OnPhase() } Architecture <|-- AbstractArchitecture AbstractArchitecture --> ArchitectureAnchor : "使用" AbstractArchitecture --> IGodotModule : "管理" IGodotModule <|-- AbstractGodotModule AbstractGodotModule --> Architecture : "回调" ``` **图表来源** - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L23-L569) - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L14-L139) - [ArchitectureAnchor.cs](file://GFramework.Godot/architecture/ArchitectureAnchor.cs#L9-L35) - [IGodotModule.cs](file://GFramework.Godot/architecture/IGodotModule.cs#L10-L27) ## 详细组件分析 ### 架构初始化流程 AbstractArchitecture的初始化流程是一个精心设计的多阶段过程: ```mermaid sequenceDiagram participant Client as "客户端代码" participant Arch as "AbstractArchitecture" participant Anchor as "ArchitectureAnchor" participant Core as "Core Architecture" Client->>Arch : 调用Initialize() Arch->>Arch : 生成架构锚点名称 Arch->>Arch : AttachToGodotLifecycle() Arch->>Anchor : 创建并绑定锚点 Arch->>Arch : InstallModules() Arch->>Core : 调用基类Init() Core->>Core : 初始化上下文和环境 Core->>Core : 调用用户Init() Core->>Core : 初始化组件(工具→模型→系统) Core->>Core : 进入Ready阶段 Core-->>Client : 初始化完成 Note over Arch,Anchor : 架构与Godot生命周期绑定完成 ``` **图表来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L56-L62) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L531-L566) #### 初始化阶段详解 1. **锚点创建阶段**:生成唯一的架构锚点名称,确保在场景树中不会冲突 2. **生命周期绑定阶段**:通过ArchitectureAnchor节点监听场景树销毁事件 3. **模块安装阶段**:调用子类实现的InstallModules方法 4. **核心初始化阶段**:委托给基类Architecture执行完整的初始化流程 **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L56-L62) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L531-L566) ### InstallModules抽象方法 InstallModules是AbstractArchitecture的核心扩展点,设计目的是: ```mermaid flowchart TD Start([调用InstallModules]) --> CheckInit{"架构锚点已初始化?"} CheckInit --> |否| ThrowError["抛出InvalidOperationException"] CheckInit --> |是| LoopModules["遍历模块列表"] LoopModules --> InstallModule["调用module.Install(this)"] InstallModule --> WaitReady["等待锚点准备就绪"] WaitReady --> AddChild["将模块节点添加为锚点子节点"] AddChild --> CallAttach["调用module.OnAttach(this)"] CallAttach --> AddToList["添加到扩展列表"] AddToList --> NextModule{"还有模块?"} NextModule --> |是| LoopModules NextModule --> |否| Complete([安装完成]) ThrowError --> End([结束]) Complete --> End ``` **图表来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L100-L119) #### 设计要求和约束 - **必须在Init方法中调用**:确保架构锚点已正确初始化 - **类型安全**:只能安装实现IGodotModule接口的模块 - **异步等待**:必须等待锚点准备就绪后再添加节点 - **生命周期管理**:模块必须正确实现OnAttach和OnDetach方法 **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L68-L119) ### 架构根节点获取机制 AbstractArchitecture提供了受保护的ArchitectureRoot属性: ```mermaid flowchart TD GetRoot[获取ArchitectureRoot] --> CheckAnchor{"_anchor是否为null?"} CheckAnchor --> |是| ThrowException["抛出InvalidOperationException"] CheckAnchor --> |否| ReturnRoot["返回_anchor引用"] ThrowException --> End([结束]) ReturnRoot --> End ``` **图表来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L49) #### 异常处理策略 - **未初始化异常**:当架构尚未完成初始化时访问根节点会抛出异常 - **设计意图**:强制开发者在正确的时机访问架构根节点 - **调试友好**:异常信息明确指示架构未准备就绪 **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L49) ### 架构销毁过程 AbstractArchitecture的销毁过程确保了资源的完整清理: ```mermaid flowchart TD Start([调用Destroy]) --> CheckDestroyed{"已销毁标记?"} CheckDestroyed --> |是| ReturnEarly["直接返回"] CheckDestroyed --> |否| SetFlag["设置_destroyed=true"] SetFlag --> LoopExtensions["遍历_extensions列表"] LoopExtensions --> CallDetach["调用ext.OnDetach()"] CallDetach --> NextExt{"还有扩展?"} NextExt --> |是| LoopExtensions NextExt --> |否| ClearList["清空扩展列表"] ClearList --> CallBaseDestroy["调用base.Destroy()"] CallBaseDestroy --> End([销毁完成]) ReturnEarly --> End ``` **图表来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L127-L139) #### 资源清理策略 1. **模块级清理**:逐个调用已安装模块的OnDetach方法 2. **列表清理**:清空模块列表,防止重复销毁 3. **基类清理**:委托给基类Architecture执行核心组件清理 4. **防重复销毁**:通过_destroyed标志防止重复销毁操作 **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L127-L139) ### Godot生命周期绑定机制 AbstractArchitecture通过ArchitectureAnchor实现了与Godot场景树的深度集成: ```mermaid sequenceDiagram participant Engine as "Godot引擎" participant SceneTree as "SceneTree" participant Anchor as "ArchitectureAnchor" participant Arch as "AbstractArchitecture" participant Modules as "已安装模块" Engine->>SceneTree : 初始化主循环 SceneTree->>Arch : 调用AttachToGodotLifecycle() Arch->>Anchor : 创建ArchitectureAnchor节点 Arch->>Anchor : 绑定Destroy回调 Anchor->>SceneTree : 添加到场景树 Note over Engine,SceneTree : 架构与Godot生命周期绑定 Engine->>SceneTree : 场景树销毁 SceneTree->>Anchor : _ExitTree()回调 Anchor->>Arch : 调用绑定的Destroy() Arch->>Modules : 逐个调用OnDetach() Arch->>Arch : 清理扩展列表 Arch->>SceneTree : 基类Destroy() ``` **图表来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L74-L91) - [ArchitectureAnchor.cs](file://GFramework.Godot/architecture/ArchitectureAnchor.cs#L29-L34) #### 绑定机制特点 - **延迟绑定**:使用CallDeferred确保在下一帧绑定,避免线程安全问题 - **防重复绑定**:检查场景树中是否已存在同名节点 - **自动清理**:通过_exitTree回调自动触发架构销毁 - **类型安全**:通过泛型约束确保模块实现正确的接口 **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L74-L91) - [ArchitectureAnchor.cs](file://GFramework.Godot/architecture/ArchitectureAnchor.cs#L9-L35) ## 依赖关系分析 AbstractArchitecture的依赖关系体现了清晰的分层架构: ```mermaid graph TB subgraph "外部依赖" Godot[Godot引擎] CoreAbstractions[GFramework.Core.Abstractions] end subgraph "核心层" CoreArch[Architecture基类] CoreContext[ArchitectureContext] CoreServices[ArchitectureServices] end subgraph "Godot层" AbstractArch[AbstractArchitecture] ArchAnchor[ArchitectureAnchor] IGodotModule[IGodotModule接口] AbstractGodotMod[AbstractGodotModule] end subgraph "应用层" GameArch[游戏架构实现] GameModule[游戏模块] end Godot --> ArchAnchor CoreAbstractions --> CoreArch CoreArch --> AbstractArch AbstractArch --> ArchAnchor AbstractArch --> IGodotModule IGodotModule --> AbstractGodotMod AbstractArch --> GameArch IGodotModule --> GameModule ``` **图表来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L1-L6) - [Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L1-L16) ### 关键依赖关系 1. **继承关系**:AbstractArchitecture → Architecture,获得完整的架构管理能力 2. **组合关系**:AbstractArchitecture组合了ArchitectureAnchor和模块列表 3. **接口实现**:IGodotModule定义了Godot模块的标准接口 4. **Godot集成**:直接依赖Godot引擎的节点系统和场景树管理 **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L1-L6) - [IGodotModule.cs](file://GFramework.Godot/architecture/IGodotModule.cs#L10-L27) ## 性能考虑 ### 初始化性能优化 AbstractArchitecture在初始化过程中采用了多项性能优化策略: 1. **延迟绑定**:使用CallDeferred避免阻塞主线程 2. **去重机制**:通过HashSet确保组件注册的原子性和唯一性 3. **阶段化初始化**:按工具→模型→系统的顺序初始化,减少依赖问题 4. **异步支持**:支持异步组件初始化,提高响应性 ### 内存管理 1. **弱引用模式**:模块列表使用List而非Dictionary,减少内存开销 2. **及时清理**:销毁时立即清空模块列表,避免内存泄漏 3. **生命周期感知**:所有组件都实现了IDisposable接口,确保资源正确释放 ### 最佳实践建议 - **模块大小**:每个Godot模块应该职责单一,避免过度复杂的节点树 - **节点层级**:合理控制节点层级深度,避免过深的场景树结构 - **资源管理**:模块内部应该妥善管理自己的资源,避免内存泄漏 ## 故障排除指南 ### 常见问题和解决方案 #### 1. "架构根节点未就绪"异常 **症状**:访问ArchitectureRoot属性时抛出InvalidOperationException **原因**: - 在架构初始化完成前访问根节点 - 架构已被销毁后再次尝试访问 **解决方案**: - 确保在Initialize()或InitializeAsync()完成后访问根节点 - 避免在Destroy()后重新使用架构实例 #### 2. 模块安装失败 **症状**:InstallGodotModule抛出InvalidOperationException **原因**: - 在模块安装前没有正确初始化架构 - 模块节点添加到场景树失败 **解决方案**: - 确保在InstallModules中调用InstallGodotModule - 检查模块的Node属性是否正确实现 #### 3. 资源清理不完全 **症状**:游戏退出后仍有资源未释放 **原因**: - 模块未正确实现OnDetach方法 - 模块内部持有静态引用 **解决方案**: - 确保每个模块都正确实现OnDetach - 检查模块内部是否有静态引用或事件订阅 **章节来源** - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L49) - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L105) ## 结论 AbstractArchitecture基类成功地将Core架构的通用功能与Godot引擎的特定需求相结合,提供了一个强大而灵活的架构框架。其主要优势包括: 1. **完整的生命周期管理**:通过ArchitectureAnchor实现了与Godot场景树的深度集成 2. **模块化设计**:支持IGodotModule接口的模块化扩展机制 3. **类型安全**:提供强类型约束,减少运行时错误 4. **资源管理**:自动化的资源清理机制确保内存安全 5. **易于使用**:简洁的API设计降低了使用复杂度 该基类为Godot游戏开发提供了一个坚实的基础,开发者可以基于此构建复杂的游戏架构,同时享受GFramework带来的开发效率和可靠性提升。 ## 附录 ### 使用示例 以下是一个完整的AbstractArchitecture使用示例: ```csharp // 1. 创建游戏架构类 public class MyGameArchitecture : AbstractArchitecture { protected override void Init() { // 注册核心组件 RegisterModel(new PlayerModel()); RegisterSystem(new PlayerControllerSystem()); RegisterUtility(new AudioManager()); // 调用基类Init完成核心初始化 base.Init(); } protected override void InstallModules() { // 安装Godot特定模块 InstallGodotModule(new UIManager()); InstallGodotModule(new InputManager()); InstallGodotModule(new AudioManager()); } } // 2. 创建Godot模块 [GlobalClass] public partial class UIManager : AbstractGodotModule { private Control _uiRoot; public override Node Node => this; public override void Install(IArchitecture architecture) { architecture.RegisterSystem(new UIMessageSystem()); architecture.RegisterUtility(new UIAnimationUtility()); } public override void OnAttach(Architecture architecture) { // 创建UI根节点 _uiRoot = new Control(); AddChild(_uiRoot); // 初始化UI系统 GetSystem().Initialize(_uiRoot); } public override void OnDetach() { // 清理UI资源 _uiRoot?.QueueFree(); _uiRoot = null; } } ``` ### 最佳实践清单 1. **模块设计** - 每个模块职责单一 - 模块间通过事件通信 - 避免模块间的直接依赖 2. **资源管理** - 模块内部妥善管理资源 - 在OnDetach中清理所有资源 - 避免静态引用导致的内存泄漏 3. **错误处理** - 在模块中适当处理异常 - 提供有意义的错误信息 - 确保模块的健壮性 4. **性能优化** - 合理控制模块数量 - 优化节点层级结构 - 使用异步加载大型资源 **章节来源** - [godot-integration.md](file://docs/tutorials/godot-integration.md#L24-L40) - [architecture-patterns.md](file://docs/best-practices/architecture-patterns.md#L695-L744)