# UI过渡管道
**本文引用的文件**
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs)
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs)
- [UiTransitionHandlerOptions.cs](file://GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs)
- [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件围绕 GFramework 的 UI 过渡管道(UiTransitionPipeline)提供系统化、可操作的技术文档。重点涵盖:
- 管道设计与执行机制:BeforeChange 与 AfterChange 两阶段的处理流程与职责边界
- 处理器注册与注销:RegisterHandler 与 UnregisterHandler 的使用方式与注意事项
- 配置选项与执行策略:UiTransitionHandlerOptions 的超时与错误继续策略
- 事件模型:UiTransitionEvent 的属性与上下文传递机制
- 执行顺序与异常处理:基于优先级的排序、取消令牌与异常分支
- 自定义处理器开发指南与实践示例
- 与 UI 路由系统的集成方式与性能优化建议
## 项目结构
UiTransitionPipeline 位于游戏层(GFramework.Game),其接口与事件模型位于抽象层(GFramework.Game.Abstractions)。处理器基类与示例处理器位于游戏层。
```mermaid
graph TB
subgraph "抽象层"
A["IUiTransitionHandler 接口"]
B["UiTransitionEvent 事件模型"]
C["UiTransitionHandlerOptions 执行选项"]
D["UITransitionPhases 阶段枚举"]
E["UiTransitionType 类型枚举"]
F["UiTransitionPolicy 策略枚举"]
end
subgraph "游戏层"
G["UiTransitionPipeline 管道"]
H["UiTransitionHandlerBase 抽象基类"]
I["LoggingTransitionHandler 示例处理器"]
end
A --> G
B --> G
C --> G
D --> G
E --> B
F --> B
H --> I
I --> G
```
图表来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L1-L105)
- [UiTransitionHandlerOptions.cs](file://GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs#L1-L6)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27)
- [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
章节来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L1-L168)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L1-L39)
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L1-L105)
- [UiTransitionHandlerOptions.cs](file://GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs#L1-L6)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L1-L27)
- [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L1-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L1-L48)
## 核心组件
- UiTransitionPipeline:负责管理与执行 UI 过渡处理器链,支持按阶段过滤与优先级排序,并提供统一的超时与错误处理策略。
- IUiTransitionHandler:处理器接口,定义优先级、适用阶段、条件判断与异步处理方法。
- UiTransitionHandlerBase:处理器抽象基类,提供默认的阶段与条件判断行为,便于快速实现自定义处理器。
- UiTransitionEvent:事件承载对象,包含源 UI、目标 UI、切换类型、策略、进入参数以及可扩展的上下文字典。
- UiTransitionHandlerOptions:处理器执行选项,支持超时时间与错误继续策略。
- UITransitionPhases:阶段枚举,定义 BeforeChange 与 AfterChange 两个阶段及其组合。
章节来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L11-L168)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L9-L33)
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L10-L105)
- [UiTransitionHandlerOptions.cs](file://GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs#L6)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L9-L27)
## 架构总览
UiTransitionPipeline 采用“处理器链”模式,将 UI 切换过程拆分为 BeforeChange 与 AfterChange 两个阶段。每个阶段通过过滤与排序选择合适的处理器,依次执行。处理器内部可利用 UiTransitionEvent 的上下文字典进行数据传递,也可通过取消令牌与超时机制保证稳定性。
```mermaid
sequenceDiagram
participant Router as "UI路由器"
participant Pipeline as "UiTransitionPipeline"
participant H1 as "处理器A"
participant H2 as "处理器B"
Router->>Pipeline : "ExecuteAsync(event, BeforeChange)"
Pipeline->>Pipeline : "FilterAndSortHandlers(event, BeforeChange)"
Pipeline->>H1 : "HandleAsync(event, ct)"
H1-->>Pipeline : "完成/异常"
Pipeline->>H2 : "HandleAsync(event, ct)"
H2-->>Pipeline : "完成/异常"
Pipeline-->>Router : "BeforeChange 完成"
Router->>Pipeline : "ExecuteAsync(event, AfterChange)"
Pipeline->>Pipeline : "FilterAndSortHandlers(event, AfterChange)"
Pipeline->>H1 : "HandleAsync(event, ct)"
H1-->>Pipeline : "完成/异常"
Pipeline->>H2 : "HandleAsync(event, ct)"
H2-->>Pipeline : "完成/异常"
Pipeline-->>Router : "AfterChange 完成"
```
图表来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L63-L101)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L32-L38)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L9-L27)
## 详细组件分析
### UiTransitionPipeline 组件分析
- 设计要点
- 处理器集合与选项映射:内部维护处理器列表与对应执行选项,确保每个处理器拥有独立的超时与错误策略。
- 注册与注销:提供 RegisterHandler 与 UnregisterHandler,支持重复注册检测与日志记录;注销时同步移除选项映射。
- 执行流程:按阶段过滤与优先级排序,逐个执行处理器;支持取消令牌与超时组合;异常分支明确区分取消与错误并决定是否中断。
- 上下文记录:在执行前后记录阶段、来源 UI、目标 UI、切换类型与处理器数量等关键信息,便于调试与审计。
- 关键方法与行为
- RegisterHandler:校验非空,避免重复注册,记录处理器优先级与阶段信息。
- UnregisterHandler:移除处理器与对应选项,记录注销日志。
- ExecuteAsync:设置事件阶段标记,过滤与排序,逐个执行单个处理器。
- FilterAndSortHandlers:按适用阶段与条件判断筛选,并按优先级升序排列。
- ExecuteSingleHandlerAsync:合并外部取消与超时取消,捕获取消与异常,依据选项决定是否继续。
- 异常与取消处理
- 超时:当超时发生且未被外部取消时,记录错误并依据 ContinueOnError 决定是否抛出中断管道。
- 取消:区分外部取消与超时取消,前者直接记录并抛出;后者记录超时并依据选项处理。
- 其他异常:记录错误并依据选项决定是否中断。
```mermaid
flowchart TD
Start(["开始执行"]) --> SetPhases["设置事件阶段
记录阶段与上下文"]
SetPhases --> Filter["过滤与排序
按Phases与ShouldHandle
按Priority升序"]
Filter --> HasHandlers{"是否有处理器?"}
HasHandlers --> |否| LogSkip["记录无处理器并返回"]
HasHandlers --> |是| Loop["遍历处理器"]
Loop --> Exec["执行单个处理器
合并取消与超时"]
Exec --> TryCancel{"是否取消?"}
TryCancel --> |超时取消| Timeout["记录超时日志
依据ContinueOnError决定是否抛出"]
TryCancel --> |外部取消| Cancel["记录取消日志并抛出"]
Exec --> TryErr{"是否异常?"}
TryErr --> |是| Error["记录错误日志
依据ContinueOnError决定是否抛出"]
TryErr --> |否| Next["下一个处理器"]
Timeout --> Next
Cancel --> End(["结束"])
Error --> Next
Next --> Done{"是否还有处理器?"}
Done --> |是| Loop
Done --> |否| LogDone["记录完成日志"] --> End
```
图表来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L63-L168)
章节来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L11-L168)
### IUiTransitionHandler 与 UiTransitionHandlerBase
- IUiTransitionHandler
- Priority:数值越小优先级越高,影响执行顺序。
- Phases:阶段标志位,可同时包含 BeforeChange 与 AfterChange。
- ShouldHandle:根据事件与阶段判断是否处理,支持细粒度过滤。
- HandleAsync:异步处理逻辑,接收事件与取消令牌。
- UiTransitionHandlerBase
- 提供默认实现:Phases 默认 All,ShouldHandle 默认 true,需子类实现 Priority 与 HandleAsync。
```mermaid
classDiagram
class IUiTransitionHandler {
+int Priority
+UITransitionPhases Phases
+bool ShouldHandle(event, phases) bool
+Task HandleAsync(event, cancellationToken)
}
class UiTransitionHandlerBase {
+UITransitionPhases Phases
+int Priority
+bool ShouldHandle(event, phases) bool
+Task HandleAsync(event, cancellationToken)
}
IUiTransitionHandler <|.. UiTransitionHandlerBase : "实现"
```
图表来源
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L9-L33)
章节来源
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L9-L33)
### UiTransitionEvent 事件模型
- 核心属性
- FromUiKey:切换前 UI 的标识符
- ToUiKey:切换后 UI 的标识符(可为空)
- TransitionType:切换类型(如 Push、Pop、Replace 等)
- Policy:切换策略(缓存、弹出等策略)
- EnterParam:进入参数(向目标 UI 传递的数据)
- 上下文字典
- Get/TryGet/Set/Has/Remove:提供类型安全的键值访问,用于处理器间传递数据与状态。
- 阶段标记
- 管道在执行前会将阶段字符串写入事件上下文,便于处理器读取。
```mermaid
classDiagram
class UiTransitionEvent {
-Dictionary~string, object~ _context
+string FromUiKey
+string? ToUiKey
+UiTransitionType TransitionType
+UiTransitionPolicy Policy
+IUiPageEnterParam? EnterParam
+T Get~T~(key, defaultValue)
+bool TryGet~T~(key, out value)
+void Set~T~(key, value)
+bool Has(key) bool
+bool Remove(key) bool
}
```
图表来源
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L10-L105)
章节来源
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L10-L105)
### UiTransitionHandlerOptions 执行策略
- TimeoutMs:处理器执行超时时间(毫秒),0 表示不限制;与外部取消令牌合并使用。
- ContinueOnError:发生异常或超时时是否继续执行后续处理器;false 时立即中断。
章节来源
- [UiTransitionHandlerOptions.cs](file://GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs#L6)
### 阶段与类型/策略枚举
- UITransitionPhases:BeforeChange(可阻塞切换)、AfterChange(不可阻塞)、All(两者皆执行)
- UiTransitionType:切换类型(具体枚举项见枚举定义)
- UiTransitionPolicy:切换策略(具体枚举项见枚举定义)
章节来源
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L9-L27)
- [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs)
### 示例处理器:LoggingTransitionHandler
- 作用:记录 UI 切换的关键信息,便于调试与审计。
- 实现:继承 UiTransitionHandlerBase,设置高优先级与全阶段处理,记录事件上下文中的阶段、类型、来源与目标 UI、策略等。
章节来源
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L11-L48)
## 依赖关系分析
- 管道对处理器的依赖:通过接口 IUiTransitionHandler 解耦,支持多实现并行存在。
- 管道对事件与选项的依赖:事件承载上下文,选项控制超时与错误策略。
- 阶段枚举与类型/策略枚举:为事件提供语义化标识,驱动处理器的条件判断与行为差异。
- 日志系统:管道与处理器均使用统一的日志工厂进行日志记录,便于追踪执行路径与问题定位。
```mermaid
graph LR
Pipeline["UiTransitionPipeline"] --> Handlers["IUiTransitionHandler[]"]
Pipeline --> Options["UiTransitionHandlerOptions[]"]
Pipeline --> Event["UiTransitionEvent"]
Event --> Phases["UITransitionPhases"]
Event --> Type["UiTransitionType"]
Event --> Policy["UiTransitionPolicy"]
Handlers --> Base["UiTransitionHandlerBase"]
Base --> Example["LoggingTransitionHandler"]
```
图表来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L14-L15)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L9-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L11-L48)
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L10-L105)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L9-L27)
- [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs)
章节来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L11-L168)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39)
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L9-L33)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L11-L48)
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L10-L105)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L9-L27)
- [UiTransitionType.cs](file://GFramework.Game.Abstractions/enums/UiTransitionType.cs)
- [UiTransitionPolicy.cs](file://GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs)
## 性能考量
- 处理器数量与排序成本:每次执行都会对处理器进行过滤与排序,建议合理控制处理器数量与复杂度。
- 超时与取消:为耗时处理器设置合理的 TimeoutMs,避免阻塞 UI 切换;在外部取消场景下及时响应。
- 错误继续策略:对于可容忍失败的 AfterChange 处理器,可启用 ContinueOnError 以提升鲁棒性。
- 日志开销:在生产环境适当降低日志级别,避免频繁记录带来的性能损耗。
- 并发与线程:处理器 HandleAsync 应为纯异步逻辑,避免阻塞调用;若涉及 UI 更新,请结合平台主线程调度。
## 故障排查指南
- 管道未执行任何处理器
- 检查处理器的 Phases 是否包含当前阶段;确认 ShouldHandle 返回 true。
- 查看日志中“无处理器可执行”的记录。
- 处理器被重复注册
- 管道会检测并跳过重复注册,检查注册逻辑是否多次调用 RegisterHandler。
- 超时导致中断
- 检查处理器执行时间与 TimeoutMs 设置;必要时调整或拆分长任务。
- 若为外部取消,确认上游取消令牌来源。
- 异常导致中断
- 检查处理器内部异常处理;如允许继续,设置 ContinueOnError=true。
- 日志与审计
- 使用 LoggingTransitionHandler 记录关键信息;核对事件上下文中的阶段与键值。
章节来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L119-L167)
- [LoggingTransitionHandler.cs](file://GFramework.Game/ui/handler/LoggingTransitionHandler.cs#L34-L47)
## 结论
UiTransitionPipeline 通过清晰的阶段划分、灵活的处理器注册与排序机制、完善的超时与错误处理策略,为 UI 路由系统提供了稳定、可扩展的过渡扩展点。配合 UiTransitionEvent 的上下文传递能力与 UiTransitionHandlerOptions 的执行策略,开发者可以在不侵入路由核心的前提下,实现丰富的过渡行为与可观测性。
## 附录
### 处理器注册与注销最佳实践
- 在模块初始化阶段集中注册处理器,避免运行期动态注册带来的不确定性。
- 对于需要在切换前阻塞的处理器,设置较低的 Priority 并在 BeforeChange 阶段执行。
- 对于后台统计与日志类处理器,设置较高的 Priority 并在 AfterChange 阶段执行。
- 合理设置 TimeoutMs 与 ContinueOnError,平衡用户体验与系统稳定性。
章节来源
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L22-L54)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L14-L21)
### 自定义处理器开发指南
- 继承 UiTransitionHandlerBase,至少实现 Priority 与 HandleAsync。
- 如需限制适用阶段,重写 Phases;如需条件过滤,重写 ShouldHandle。
- 在 HandleAsync 中读取 UiTransitionEvent 的属性与上下文,完成业务逻辑。
- 对可能耗时的操作设置超时,必要时拆分为多个处理器以提高可控性。
章节来源
- [UiTransitionHandlerBase.cs](file://GFramework.Game/ui/handler/UiTransitionHandlerBase.cs#L9-L33)
- [IUiTransitionHandler.cs](file://GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs#L10-L39)
### 与 UI 路由系统的集成方式
- 在路由发起切换前,构造 UiTransitionEvent(设置 FromUiKey、ToUiKey、TransitionType、Policy、EnterParam 等),调用管道 BeforeChange 阶段。
- 在切换完成后,再次调用 AfterChange 阶段,用于非阻塞的收尾工作。
- 通过事件上下文在处理器间传递数据,例如预加载资源结果、用户确认状态等。
章节来源
- [UiTransitionEvent.cs](file://GFramework.Game.Abstractions/ui/UiTransitionEvent.cs#L10-L105)
- [UITransitionPhases.cs](file://GFramework.Game.Abstractions/enums/UITransitionPhases.cs#L9-L27)
- [UiTransitionPipeline.cs](file://GFramework.Game/ui/UiTransitionPipeline.cs#L63-L101)