# 性能优化
**本文引用的文件**
- [GFramework.Core/coroutine/CoroutineScheduler.cs](file://GFramework.Core/coroutine/CoroutineScheduler.cs)
- [GFramework.Core/coroutine/CoroutineSlot.cs](file://GFramework.Core/coroutine/CoroutineSlot.cs)
- [GFramework.Core/coroutine/CoroutineHandle.cs](file://GFramework.Core/coroutine/CoroutineHandle.cs)
- [GFramework.Core/coroutine/CoroutineHelper.cs](file://GFramework.Core/coroutine/CoroutineHelper.cs)
- [GFramework.Core/pool/AbstractObjectPoolSystem.cs](file://GFramework.Core/pool/AbstractObjectPoolSystem.cs)
- [GFramework.Core/events/EventBus.cs](file://GFramework.Core/events/EventBus.cs)
- [GFramework.Core/events/EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs)
- [GFramework.Core/events/EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs)
- [GFramework.Core/query/AsyncQueryBus.cs](file://GFramework.Core/query/AsyncQueryBus.cs)
- [GFramework.Core/command/CommandBus.cs](file://GFramework.Core/command/CommandBus.cs)
- [GFramework.Core/ioc/IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs)
- [GFramework.Core/logging/ConsoleLogger.cs](file://GFramework.Core/logging/ConsoleLogger.cs)
- [GFramework.Core.Abstractions/pool/IPoolableObject.cs](file://GFramework.Core.Abstractions/pool/IPoolableObject.cs)
- [GFramework.Core/pool/README.md](file://GFramework.Core/pool/README.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向GFramework的性能优化实践,围绕内存管理、协程调度、事件系统、资源加载与性能监控五大主题,结合代码库中的实际实现,给出可落地的最佳实践与优化建议。内容兼顾工程效率与长期维护性,帮助团队在保证稳定性的同时获得更佳的运行时表现。
## 项目结构
GFramework采用分层与模块化组织,核心能力集中在Core层,Godot适配位于GFramework.Godot,游戏业务位于GFramework.Game。与性能优化直接相关的关键目录如下:
- coroutine:协程调度与等待指令
- pool:对象池系统
- events:事件总线与事件管理
- query/command:查询/命令总线
- ioc:依赖注入容器
- architecture/system:架构生命周期与系统基类
- logging:日志基础设施
```mermaid
graph TB
subgraph "核心层(Core)"
A["architecture/Architecture.cs"]
B["system/AbstractSystem.cs"]
C["ioc/IocContainer.cs"]
D["coroutine/CoroutineScheduler.cs"]
E["pool/AbstractObjectPoolSystem.cs"]
F["events/EventBus.cs"]
G["query/AsyncQueryBus.cs"]
H["command/CommandBus.cs"]
end
subgraph "Godot适配(Godot)"
GD1["coroutine/GodotTimeSource.cs"]
end
A --> C
A --> D
A --> E
A --> F
A --> G
A --> H
D -.-> GD1
```
**图表来源**
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L23-L88)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62)
- [GFramework.Core/ioc/IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L12-L51)
- [GFramework.Core/coroutine/CoroutineScheduler.cs](file://GFramework.Core/coroutine/CoroutineScheduler.cs#L11-L24)
- [GFramework.Core/pool/AbstractObjectPoolSystem.cs](file://GFramework.Core/pool/AbstractObjectPoolSystem.cs#L11-L17)
- [GFramework.Core/events/EventBus.cs](file://GFramework.Core/events/EventBus.cs#L8-L10)
- [GFramework.Core/query/AsyncQueryBus.cs](file://GFramework.Core/query/AsyncQueryBus.cs#L8-L16)
- [GFramework.Core/command/CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L9-L16)
**章节来源**
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L23-L88)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L13-L62)
- [GFramework.Core/ioc/IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L12-L51)
## 核心组件
- 协程调度器:负责协程的创建、推进、暂停/恢复、终止与等待链管理,内置槽位数组与元数据映射,支持按标签批量终止。
- 对象池系统:提供键控对象池,支持Acquire/Release/Clear,与系统生命周期联动,降低GC压力。
- 事件系统:基于类型事件的注册/注销/触发,支持全局事件管理器与泛型事件自动创建。
- 查询/命令总线:同步/异步执行查询与命令,参数校验与异常处理。
- 依赖注入容器:线程安全注册与获取,支持冻结后禁止修改,便于运行期稳定。
- 架构生命周期:统一组件初始化/销毁流程,阶段化通知,便于性能敏感组件的有序启动与回收。
**章节来源**
- [GFramework.Core/coroutine/CoroutineScheduler.cs](file://GFramework.Core/coroutine/CoroutineScheduler.cs#L11-L121)
- [GFramework.Core/pool/AbstractObjectPoolSystem.cs](file://GFramework.Core/pool/AbstractObjectPoolSystem.cs#L24-L70)
- [GFramework.Core/events/EventBus.cs](file://GFramework.Core/events/EventBus.cs#L16-L54)
- [GFramework.Core/query/AsyncQueryBus.cs](file://GFramework.Core/query/AsyncQueryBus.cs#L16-L21)
- [GFramework.Core/command/CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L16-L61)
- [GFramework.Core/ioc/IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L69-L199)
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L264-L347)
## 架构总览
下图展示与性能优化强相关的组件交互:架构负责注册与生命周期管理,容器提供线程安全的依赖解析,调度器驱动协程,事件系统承载解耦通信,对象池降低内存分配,查询/命令总线支撑数据与控制流。
```mermaid
graph TB
Arch["架构(Architecture)"]
Ctx["上下文(ArchitectureContext)"]
IOC["容器(IocContainer)"]
Sys["系统(AbstractSystem)"]
Pool["对象池(AbstractObjectPoolSystem)"]
Coro["协程调度器(CoroutineScheduler)"]
Ev["事件总线(EventBus)"]
Q["查询总线(AsyncQueryBus)"]
Cmd["命令总线(CommandBus)"]
Arch --> IOC
Arch --> Coro
Arch --> Ev
Arch --> Q
Arch --> Cmd
Arch --> Pool
Arch --> Sys
IOC --> Sys
Sys --> Pool
Sys --> Coro
Sys --> Ev
Sys --> Q
Sys --> Cmd
```
**图表来源**
- [GFramework.Core/architecture/Architecture.cs](file://GFramework.Core/architecture/Architecture.cs#L423-L483)
- [GFramework.Core/ioc/IocContainer.cs](file://GFramework.Core/ioc/IocContainer.cs#L155-L158)
- [GFramework.Core/pool/AbstractObjectPoolSystem.cs](file://GFramework.Core/pool/AbstractObjectPoolSystem.cs#L11-L17)
- [GFramework.Core/coroutine/CoroutineScheduler.cs](file://GFramework.Core/coroutine/CoroutineScheduler.cs#L11-L24)
- [GFramework.Core/events/EventBus.cs](file://GFramework.Core/events/EventBus.cs#L8-L10)
- [GFramework.Core/query/AsyncQueryBus.cs](file://GFramework.Core/query/AsyncQueryBus.cs#L8-L16)
- [GFramework.Core/command/CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L9-L16)
## 详细组件分析
### 协程调度器性能优化
- 设计要点
- 固定容量槽位数组+元数据字典,O(1)定位与状态管理。
- 预热机制在Run时推进首个MoveNext,减少首帧等待。
- 等待指令链式推进,异常捕获后主动Complete,避免悬挂。
- 支持WaitForCoroutine等待链唤醒,减少轮询成本。
- 标签索引支持按标签批量终止,便于场景切换时的资源回收。
- 性能建议
- 合理设置初始容量,避免频繁扩容;扩容为倍增,注意峰值协程数。
- 使用WaitForFrames/WaitOneFrame替代轮询,降低Update循环开销。
- 为长耗时协程设置超时/取消路径,配合标签批量终止。
- 将高频短协程合并为单次Update内的多次MoveNext,减少调度抖动。
- 关键路径
- Run:创建槽位、元数据、预热、活跃计数+1。
- Update:遍历槽位,处理Waiting、MoveNext、异常处理。
- Complete:回收槽位、移除标签、唤醒等待者。
- Expand:容量翻倍,注意峰值内存占用。
```mermaid
classDiagram
class CoroutineScheduler {
+DeltaTime : double
+ActiveCoroutineCount : int
+Run(coroutine, tag) CoroutineHandle
+Update() void
+Pause(handle) bool
+Resume(handle) bool
+Kill(handle) bool
+WaitForCoroutine(current, target) void
+KillByTag(tag) int
+Clear() int
}
class CoroutineSlot {
+Enumerator : IEnumerator
+State : CoroutineState
+Waiting : IYieldInstruction
}
class CoroutineHandle {
+IsValid : bool
+Key : byte
}
CoroutineScheduler --> CoroutineSlot : "管理"
CoroutineScheduler --> CoroutineHandle : "索引"
```
**图表来源**
- [GFramework.Core/coroutine/CoroutineScheduler.cs](file://GFramework.Core/coroutine/CoroutineScheduler.cs#L11-L121)
- [GFramework.Core/coroutine/CoroutineSlot.cs](file://GFramework.Core/coroutine/CoroutineSlot.cs#L8-L24)
- [GFramework.Core/coroutine/CoroutineHandle.cs](file://GFramework.Core/coroutine/CoroutineHandle.cs#L7-L44)
**章节来源**
- [GFramework.Core/coroutine/CoroutineScheduler.cs](file://GFramework.Core/coroutine/CoroutineScheduler.cs#L43-L121)
- [GFramework.Core/coroutine/CoroutineSlot.cs](file://GFramework.Core/coroutine/CoroutineSlot.cs#L8-L24)
- [GFramework.Core/coroutine/CoroutineHandle.cs](file://GFramework.Core/coroutine/CoroutineHandle.cs#L7-L44)
### 对象池系统性能优化
- 设计要点
- 基于字典+栈的键控池,Acquire优先弹栈,空则Create。
- 与AbstractSystem生命周期集成,系统销毁时统一调用OnPoolDestroy。
- 支持Clear一次性销毁所有池内对象,避免碎片化残留。
- 性能建议
- 明确对象池键域,避免键爆炸导致字典膨胀。
- 限制池大小或动态调整上限,防止内存占用随时间增长。
- 在OnAcquire/OnRelease中做最小必要重置,避免昂贵操作。
- 与协程/事件配合,避免在Update中频繁创建临时对象。
- 关键路径
- Acquire:取栈顶或Create,调用OnAcquire。
- Release:调用OnRelease,压栈。
- Clear:遍历所有对象调用OnPoolDestroy并清空字典。
```mermaid
flowchart TD
Start(["进入Acquire"]) --> CheckPool["检查池是否存在"]
CheckPool --> Exists{"池存在?"}
Exists --> |否| NewPool["创建新栈"]
Exists --> |是| Pop["弹栈取对象"]
NewPool --> Create["Create(key)"]
Pop --> HasObj{"栈非空?"}
HasObj --> |是| OnAcquire["OnAcquire()"]
HasObj --> |否| Create
Create --> OnAcquire
OnAcquire --> Return["返回对象"]
```
**图表来源**
- [GFramework.Core/pool/AbstractObjectPoolSystem.cs](file://GFramework.Core/pool/AbstractObjectPoolSystem.cs#L24-L38)
**章节来源**
- [GFramework.Core/pool/AbstractObjectPoolSystem.cs](file://GFramework.Core/pool/AbstractObjectPoolSystem.cs#L24-L70)
- [GFramework.Core.Abstractions/pool/IPoolableObject.cs](file://GFramework.Core.Abstractions/pool/IPoolableObject.cs#L6-L22)
- [GFramework.Core/system/AbstractSystem.cs](file://GFramework.Core/system/AbstractSystem.cs#L54-L61)
- [GFramework.Core/pool/README.md](file://GFramework.Core/pool/README.md#L770-L812)
### 事件系统性能优化
- 设计要点
- EventBus封装EasyEvents,提供Send/Register/UnRegister。
- EasyEvents全局单例+类型字典,GetOrAddEvent避免重复创建。
- EasyEvent简单事件聚合器,支持注册/注销/触发。
- 性能建议
- 事件粒度拆分:高频事件拆分为细粒度事件,避免一次触发大量回调。
- 事件批处理:在Update末尾集中触发一批事件,减少多次触发的开销。
- 反注册及时:不再使用的回调务必UnRegister,避免回调链膨胀。
- 事件过滤:在注册侧加入谓词过滤,减少无效回调执行。
- 关键路径
- Send():GetOrAddEvent() -> Trigger(new T())
- Register():GetOrAddEvent() -> Register(onEvent)
```mermaid
sequenceDiagram
participant S as "发送方"
participant Bus as "EventBus"
participant Events as "EasyEvents"
participant Evt as "Event"
S->>Bus : Send()
Bus->>Events : GetOrAddEvent>()
Events-->>Bus : Event 实例
Bus->>Evt : Trigger(new T())
Note over Bus,Evt : 触发所有已注册回调
```
**图表来源**
- [GFramework.Core/events/EventBus.cs](file://GFramework.Core/events/EventBus.cs#L16-L33)
- [GFramework.Core/events/EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs#L74-L84)
**章节来源**
- [GFramework.Core/events/EventBus.cs](file://GFramework.Core/events/EventBus.cs#L16-L54)
- [GFramework.Core/events/EasyEvents.cs](file://GFramework.Core/events/EasyEvents.cs#L26-L84)
- [GFramework.Core/events/EasyEvent.cs](file://GFramework.Core/events/EasyEvent.cs#L17-L38)
### 查询/命令总线性能优化
- 设计要点
- AsyncQueryBus/Sync CommandBus均进行参数非空校验,避免空引用异常。
- 异步路径直接返回Task,减少额外包装开销。
- 性能建议
- 将CPU密集型任务放入后台线程或协程,避免阻塞主线程。
- 对频繁小查询进行合并或缓存结果,减少重复计算。
- 命令幂等化设计,避免重试导致的重复开销。
- 关键路径
- AsyncQueryBus.SendAsync:校验 -> DoAsync()
- CommandBus.Send/SendAsync:校验 -> Execute/ExecuteAsync()
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant QBus as "AsyncQueryBus"
participant Q as "IAsyncQuery"
Caller->>QBus : SendAsync(query)
QBus->>Q : DoAsync()
Q-->>QBus : Task
QBus-->>Caller : Task
```
**图表来源**
- [GFramework.Core/query/AsyncQueryBus.cs](file://GFramework.Core/query/AsyncQueryBus.cs#L16-L21)
**章节来源**
- [GFramework.Core/query/AsyncQueryBus.cs](file://GFramework.Core/query/AsyncQueryBus.cs#L16-L21)
- [GFramework.Core/command/CommandBus.cs](file://GFramework.Core/command/CommandBus.cs#L16-L61)
### 依赖注入容器性能优化
- 设计要点
- ReaderWriterLockSlim读写锁,读多写少场景高效。
- Contains/Get/GetAll/Freeze等操作均考虑线程安全与一致性。
- 冻结后禁止注册,避免运行期不稳定。
- 性能建议
- 尽量在初始化阶段完成注册,避免运行期频繁注册/注销。
- 使用GetAllSorted按优先级排序后调度,减少运行时比较成本。
- 避免过度注册同一实例,减少类型索引冲突与查找成本。
- 关键路径
- RegisterPlurality:注册具体类型与所有接口。
- GetAll:快照返回,避免并发修改影响。
```mermaid
classDiagram
class IocContainer {
-_lock : ReaderWriterLockSlim
-_frozen : bool
-_objects : HashSet