GeWuYou a79f02c987 docs(api): 添加 Core API 参考文档与事件系统接口文档
- 新增 Core API 参考文档,涵盖架构与模块、数据模型与系统、命令与查询等核心组件
- 添加事件系统接口详细文档,包括 IEvent、IEventBus、IUnRegister 等接口说明
- 提供完整的 API 使用示例路径、最佳实践与性能建议
- 包含架构图、依赖关系图与故障排查指南
- 添加测试用例参考与扩展方法说明
- [skip ci]
2026-01-21 23:45:10 +08:00

18 KiB
Raw Blame History

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特定层

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继承了Core架构的所有核心功能并增加了Godot特定的扩展能力

特性 描述 实现位置
架构初始化 完整的架构初始化流程,包括模块安装 Init方法
Godot生命周期绑定 通过ArchitectureAnchor节点绑定场景树生命周期 AttachToGodotLifecycle方法
模块安装系统 支持IGodotModule接口的模块安装和管理 InstallGodotModule方法
资源清理机制 架构销毁时自动清理所有已安装模块 Destroy方法
根节点访问 提供受保护的ArchitectureRoot属性访问 ArchitectureRoot属性

章节来源

架构概览

AbstractArchitecture的架构设计体现了良好的分层原则和依赖倒置

classDiagram
class Architecture {
<<abstract>>
+Initialize()
+InitializeAsync()
+Destroy()
+RegisterSystem()
+RegisterModel()
+RegisterUtility()
#Init()
#EnterPhase()
}
class AbstractArchitecture {
<<abstract>>
-_extensions : IGodotModule[]
-_anchor : ArchitectureAnchor
-_architectureAnchorName : string
-_destroyed : bool
+ArchitectureRoot : Node
#Init()
#InstallModules()
-AttachToGodotLifecycle()
+InstallGodotModule()
+Destroy()
}
class ArchitectureAnchor {
-_onExit : Action
+Bind()
+_ExitTree()
}
class IGodotModule {
<<interface>>
+Node : Node
+Install()
+OnAttach()
+OnDetach()
}
class AbstractGodotModule {
<<abstract>>
+Node : Node
+Install()
+OnAttach()
+OnDetach()
+OnPhase()
}
Architecture <|-- AbstractArchitecture
AbstractArchitecture --> ArchitectureAnchor : "使用"
AbstractArchitecture --> IGodotModule : "管理"
IGodotModule <|-- AbstractGodotModule
AbstractGodotModule --> Architecture : "回调"

图表来源

详细组件分析

架构初始化流程

AbstractArchitecture的初始化流程是一个精心设计的多阶段过程

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生命周期绑定完成

图表来源

初始化阶段详解

  1. 锚点创建阶段:生成唯一的架构锚点名称,确保在场景树中不会冲突
  2. 生命周期绑定阶段通过ArchitectureAnchor节点监听场景树销毁事件
  3. 模块安装阶段调用子类实现的InstallModules方法
  4. 核心初始化阶段委托给基类Architecture执行完整的初始化流程

章节来源

InstallModules抽象方法

InstallModules是AbstractArchitecture的核心扩展点设计目的是

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

图表来源

设计要求和约束

  • 必须在Init方法中调用:确保架构锚点已正确初始化
  • 类型安全只能安装实现IGodotModule接口的模块
  • 异步等待:必须等待锚点准备就绪后再添加节点
  • 生命周期管理模块必须正确实现OnAttach和OnDetach方法

章节来源

架构根节点获取机制

AbstractArchitecture提供了受保护的ArchitectureRoot属性

flowchart TD
GetRoot[获取ArchitectureRoot] --> CheckAnchor{"_anchor是否为null?"}
CheckAnchor --> |是| ThrowException["抛出InvalidOperationException"]
CheckAnchor --> |否| ReturnRoot["返回_anchor引用"]
ThrowException --> End([结束])
ReturnRoot --> End

图表来源

异常处理策略

  • 未初始化异常:当架构尚未完成初始化时访问根节点会抛出异常
  • 设计意图:强制开发者在正确的时机访问架构根节点
  • 调试友好:异常信息明确指示架构未准备就绪

章节来源

架构销毁过程

AbstractArchitecture的销毁过程确保了资源的完整清理

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

图表来源

资源清理策略

  1. 模块级清理逐个调用已安装模块的OnDetach方法
  2. 列表清理:清空模块列表,防止重复销毁
  3. 基类清理委托给基类Architecture执行核心组件清理
  4. 防重复销毁通过_destroyed标志防止重复销毁操作

章节来源

Godot生命周期绑定机制

AbstractArchitecture通过ArchitectureAnchor实现了与Godot场景树的深度集成

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

图表来源

绑定机制特点

  • 延迟绑定使用CallDeferred确保在下一帧绑定避免线程安全问题
  • 防重复绑定:检查场景树中是否已存在同名节点
  • 自动清理通过_exitTree回调自动触发架构销毁
  • 类型安全:通过泛型约束确保模块实现正确的接口

章节来源

依赖关系分析

AbstractArchitecture的依赖关系体现了清晰的分层架构

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

图表来源

关键依赖关系

  1. 继承关系AbstractArchitecture → Architecture获得完整的架构管理能力
  2. 组合关系AbstractArchitecture组合了ArchitectureAnchor和模块列表
  3. 接口实现IGodotModule定义了Godot模块的标准接口
  4. Godot集成直接依赖Godot引擎的节点系统和场景树管理

章节来源

性能考虑

初始化性能优化

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基类成功地将Core架构的通用功能与Godot引擎的特定需求相结合提供了一个强大而灵活的架构框架。其主要优势包括

  1. 完整的生命周期管理通过ArchitectureAnchor实现了与Godot场景树的深度集成
  2. 模块化设计支持IGodotModule接口的模块化扩展机制
  3. 类型安全:提供强类型约束,减少运行时错误
  4. 资源管理:自动化的资源清理机制确保内存安全
  5. 易于使用简洁的API设计降低了使用复杂度

该基类为Godot游戏开发提供了一个坚实的基础开发者可以基于此构建复杂的游戏架构同时享受GFramework带来的开发效率和可靠性提升。

附录

使用示例

以下是一个完整的AbstractArchitecture使用示例

// 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<UIMessageSystem>().Initialize(_uiRoot);
    }
    
    public override void OnDetach()
    {
        // 清理UI资源
        _uiRoot?.QueueFree();
        _uiRoot = null;
    }
}

最佳实践清单

  1. 模块设计

    • 每个模块职责单一
    • 模块间通过事件通信
    • 避免模块间的直接依赖
  2. 资源管理

    • 模块内部妥善管理资源
    • 在OnDetach中清理所有资源
    • 避免静态引用导致的内存泄漏
  3. 错误处理

    • 在模块中适当处理异常
    • 提供有意义的错误信息
    • 确保模块的健壮性
  4. 性能优化

    • 合理控制模块数量
    • 优化节点层级结构
    • 使用异步加载大型资源

章节来源