# Godot资源管理 **本文引用的文件** - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs) - [GodotSceneRegistry.cs](file://GFramework.Godot/scene/GodotSceneRegistry.cs) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs) - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs) - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs) - [AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs) - [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs) - [IStorage.cs](file://GFramework.Core.Abstractions/storage/IStorage.cs) - [IFileStorage.cs](file://GFramework.Game.Abstractions/storage/IFileStorage.cs) - [IUiFactory.cs](file://GFramework.Game.Abstractions/ui/IUiFactory.cs) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs) - [CacheEvictionPolicy.cs](file://GFramework.Game.Abstractions/enums/CacheEvictionPolicy.cs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [组件详解](#组件详解) 6. [依赖关系分析](#依赖关系分析) 7. [性能与最佳实践](#性能与最佳实践) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录:集成与使用示例](#附录集成与使用示例) ## 简介 本指南围绕Godot平台下的资源管理实现,系统讲解以下能力: - 文件存储:GodotFileStorage的文件读写、路径管理、线程安全与Godot虚拟路径支持 - 场景注册:GodotSceneRegistry的场景资源注册与管理 - UI系统:GodotUiFactory的UI对象创建与缓存回收、GodotUiRegistry的UI注册管理、GodotUiRoot的UI根节点控制 - 工厂模式与CanvasItem:UI页面行为管理与CanvasItem的页面行为封装 - 资源管理最佳实践:内存优化、资源缓存、异步加载策略 ## 项目结构 本仓库采用分层与平台适配的组织方式: - GFramework.Core.Abstractions:跨平台抽象接口与通用能力 - GFramework.Game.Abstractions:游戏层抽象接口 - GFramework.Godot:Godot平台实现 - GFramework.Game:通用游戏层实现(非Godot) ```mermaid graph TB subgraph "抽象层" A["IStorage 接口"] B["IUiFactory 接口"] C["IUiRoot 接口"] D["IFileStorage 接口"] end subgraph "通用实现(GFramework.Game)" E["FileStorage"] F["ScopedStorage"] end subgraph "Godot实现(GFramework.Godot)" G["GodotFileStorage"] H["GodotUiFactory"] I["GodotUiRegistry"] J["GodotUiRoot"] K["GodotSceneRegistry"] L["CanvasItemUiPageBehavior"] M["NodeExtensions"] end A --> E A --> G D --> E B --> H C --> J H --> I J --> L G --> M ``` 图表来源 - [IStorage.cs](file://GFramework.Core.Abstractions/storage/IStorage.cs#L1-L72) - [IFileStorage.cs](file://GFramework.Game.Abstractions/storage/IFileStorage.cs#L1-L9) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L1-L258) - [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs#L1-L99) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L1-L291) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L1-L463) - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs#L1-L12) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L1-L142) - [GodotSceneRegistry.cs](file://GFramework.Godot/scene/GodotSceneRegistry.cs#L1-L12) - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L1-L113) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L1-L259) 章节来源 - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L1-L291) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L1-L463) - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs#L1-L12) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L1-L142) - [GodotSceneRegistry.cs](file://GFramework.Godot/scene/GodotSceneRegistry.cs#L1-L12) - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L1-L113) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L1-L259) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L1-L258) - [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs#L1-L99) - [IStorage.cs](file://GFramework.Core.Abstractions/storage/IStorage.cs#L1-L72) - [IFileStorage.cs](file://GFramework.Game.Abstractions/storage/IFileStorage.cs#L1-L9) - [IUiFactory.cs](file://GFramework.Game.Abstractions/ui/IUiFactory.cs#L1-L87) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43) - [CacheEvictionPolicy.cs](file://GFramework.Game.Abstractions/enums/CacheEvictionPolicy.cs#L1-L18) ## 核心组件 - GodotFileStorage:Godot平台专用文件存储,支持res://、user://与普通文件路径,提供线程安全的读写与存在性检查 - GodotUiFactory:UI页面工厂,支持创建、缓存、预加载、回收与LRU/LFU淘汰策略 - GodotUiRegistry:UI场景注册表,基于键值对管理PackedScene - GodotUiRoot:UI根节点,负责页面容器、层级Z序与可见页面管理 - GodotSceneRegistry:场景注册表,管理场景资源 - CanvasItemUiPageBehavior:CanvasItem页面行为封装,统一处理显示/隐藏、暂停/恢复、模态与遮罩 - NodeExtensions:Godot节点扩展,提供安全释放、等待ready、输入处理等工具 章节来源 - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L11-L31) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L12-L31) - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs#L6-L11) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L7-L11) - [GodotSceneRegistry.cs](file://GFramework.Godot/scene/GodotSceneRegistry.cs#L6-L11) - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L7-L13) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L5-L27) ## 架构总览 Godot资源管理由“抽象接口—通用实现—平台实现”三层构成: - 抽象接口定义跨平台契约(如IStorage、IUiFactory、IUiRoot) - 通用实现提供通用逻辑(如FileStorage、ScopedStorage) - 平台实现对接Godot(如GodotFileStorage、GodotUiFactory、GodotUiRoot等) ```mermaid classDiagram class IStorage class IFileStorage class IUiFactory class IUiRoot class FileStorage class ScopedStorage class GodotFileStorage class GodotUiFactory class GodotUiRegistry class GodotUiRoot class GodotSceneRegistry class CanvasItemUiPageBehavior class NodeExtensions IStorage <|.. IFileStorage IStorage <|.. FileStorage IStorage <|.. GodotFileStorage IUiFactory <|.. GodotUiFactory IUiRoot <|.. GodotUiRoot GodotUiFactory --> GodotUiRegistry : "依赖" GodotUiRoot --> CanvasItemUiPageBehavior : "管理" GodotFileStorage --> NodeExtensions : "使用" ScopedStorage --> IStorage : "包装" ``` 图表来源 - [IStorage.cs](file://GFramework.Core.Abstractions/storage/IStorage.cs#L1-L72) - [IFileStorage.cs](file://GFramework.Game.Abstractions/storage/IFileStorage.cs#L1-L9) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L1-L258) - [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs#L1-L99) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L1-L291) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L1-L463) - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs#L1-L12) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L1-L142) - [GodotSceneRegistry.cs](file://GFramework.Godot/scene/GodotSceneRegistry.cs#L1-L12) - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L1-L113) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L1-L259) ## 组件详解 ### GodotFileStorage 文件存储实现 - 功能要点 - 支持Godot虚拟路径(res://、user://)与普通文件系统路径 - 按key细粒度锁保证线程安全;读写后尝试移除锁,避免内存泄漏 - 提供Exists/Read/Write/Delete及异步版本 - 路径清理:非法字符替换、相对路径防御(禁止..)、自动创建目录 - 关键流程 - 路径转换:ToAbsolutePath将键转为绝对路径,Godot路径直接返回,普通路径拼接并创建目录 - 读取:根据路径类型选择FileAccess或File读取文本,再交由ISerializer反序列化 - 写入:序列化后写入,Godot路径使用FileAccess,普通路径使用File.WriteAllText - 删除:根据路径类型调用DirAccess.RemoveAbsolute或File.Delete ```mermaid flowchart TD Start(["入口: Write(key,value)"]) --> ToAbs["转换为绝对路径
ToAbsolutePath(key)"] ToAbs --> GetLock["获取/创建key锁
GetLock(path)"] GetLock --> Serialize["序列化对象
_serializer.Serialize(value)"] Serialize --> IsGodot{"是否Godot路径?"} IsGodot --> |是| OpenWrite["打开FileAccess写入
StoreString(content)"] IsGodot --> |否| EnsureDir["确保目录存在
Directory.CreateDirectory"] EnsureDir --> WriteFile["File.WriteAllText
UTF8编码"] OpenWrite --> Done(["完成"]) WriteFile --> Done ``` 图表来源 - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L256-L276) 章节来源 - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L11-L31) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L85-L114) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L164-L188) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L256-L276) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L39-L66) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L132-L143) ### GodotSceneRegistry 场景注册机制 - 角色定位:继承KeyValueRegistryBase,以字符串为键、PackedScene为值,实现IGodotSceneRegistry - 使用方式:通过键注册场景,供UI或其他系统按需实例化 - 注意事项:键区分大小写,建议统一命名规范 章节来源 - [GodotSceneRegistry.cs](file://GFramework.Godot/scene/GodotSceneRegistry.cs#L6-L11) ### GodotUiFactory UI工厂与缓存策略 - 工厂职责 - GetOrCreate/Create:按策略创建UI页面 - Preload/PreloadBatch:批量预加载隐藏实例,降低首次出现卡顿 - Recycle:回收到缓存池,更新统计与访问追踪 - 缓存配置:最大容量、淘汰策略(LRU/LFU),按UIKey独立配置 - 统计查询:命中率、访问次数、最后访问时间 - 访问追踪与淘汰 - LRU:按最近访问时间队列淘汰 - LFU:按访问频次淘汰 - 生命周期管理 - 进入/显示:OnShow,恢复处理与输入 - 退出/隐藏:OnHide,隐藏节点 - 退出时自动释放节点(QueueFreeX) ```mermaid sequenceDiagram participant Caller as "调用方" participant Factory as "GodotUiFactory" participant Registry as "GodotUiRegistry" participant Scene as "PackedScene" participant Page as "IUiPageBehavior" Caller->>Factory : GetOrCreate(uiKey, policy) alt Reuse策略且有缓存 Factory->>Factory : 出队缓存实例 Factory-->>Caller : 返回缓存实例 else 无缓存 Factory->>Registry : Get(uiKey) Registry-->>Factory : PackedScene Factory->>Scene : Instantiate() Scene-->>Factory : Node Factory->>Factory : 包装为IUiPageBehavior Factory-->>Caller : 返回新实例 end ``` 图表来源 - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L67-L97) - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs#L1-L12) 章节来源 - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L67-L97) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L102-L131) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L136-L157) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L253-L274) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L280-L288) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L380-L397) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L402-L433) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L438-L460) ### GodotUiRegistry UI注册管理 - 角色定位:继承KeyValueRegistryBase,以字符串为键、PackedScene为值,实现IGodotUiRegistry - 用途:集中管理UI场景资源,供GodotUiFactory按键获取 章节来源 - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs#L6-L11) ### GodotUiRoot UI根节点控制 - 责任边界:管理UI容器节点、页面添加/移除、层级Z序设置 - 层级映射:Page/Overlay/Modal/Toast/Topmost默认Z序,可自定义映射 - 节点操作:AddChild/RemoveChild,CanvasItem.ZIndex控制渲染顺序 ```mermaid sequenceDiagram participant Root as "GodotUiRoot" participant Container as "UiContainer" participant Page as "IUiPageBehavior" participant Node as "Node(CanvasItem)" Root->>Root : AddUiPage(Page) Root->>Container : AddChild(Node) Root->>Root : SetZOrder(Page, Z) Root->>Node : ZIndex=Z ``` 图表来源 - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L59-L89) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L109-L118) 章节来源 - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L11-L142) ### CanvasItem的UI页面行为管理 - 封装对象:CanvasItemUiPageBehavior,约束T为CanvasItem - 行为接口:View(Key)/IsAlive/OnEnter/OnExit/OnPause/OnResume/OnHide/OnShow/IsModal/BlocksInput/RequiresMask - 生命周期:OnShow自动恢复处理;OnExit自动释放节点 章节来源 - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L12-L113) ### Node扩展与安全释放 - 安全释放:QueueFreeX在下一帧释放,避免当前帧删除导致崩溃 - 输入处理:SetInputAsHandled阻止事件冒泡 - Ready等待:WaitUntilReady等待节点进入场景树 - 其他:IsValidNode/IsInvalidNode、Paused、FindChildX、GetOrCreateNode、ForEachChild、DisableInput/EnableInput、LogNodePath/PrintTreeX、SafeCallDeferred、OfType 章节来源 - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L14-L46) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L52-L55) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L88-L92) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L127-L139) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L147-L151) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L191-L207) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L213-L230) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L237-L242) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L252-L259) ### 通用存储与作用域包装 - FileStorage:基于文件系统的存储,提供线程安全的读写与存在性检查 - ScopedStorage:为键添加前缀的作用域包装,便于模块化隔离与多租户 章节来源 - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L11-L33) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L72-L103) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L144-L209) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L221-L255) - [ScopedStorage.cs](file://GFramework.Game/storage/ScopedStorage.cs#L11-L99) ## 依赖关系分析 - 抽象接口与实现解耦:IStorage/IUiFactory/IUiRoot定义契约,Godot实现与通用实现分别满足 - GodotFileStorage依赖NodeExtensions进行路径判定与文件操作 - GodotUiFactory依赖GodotUiRegistry获取场景,CanvasItemUiPageBehavior封装页面行为 - GodotUiRoot管理CanvasItem的Z序,统一渲染顺序 ```mermaid graph LR IStorage["IStorage"] --> FileStorage["FileStorage"] IStorage --> GodotFileStorage["GodotFileStorage"] IFileStorage["IFileStorage"] --> FileStorage IUiFactory["IUiFactory"] --> GodotUiFactory["GodotUiFactory"] IUiRoot["IUiRoot"] --> GodotUiRoot["GodotUiRoot"] GodotUiFactory --> GodotUiRegistry["GodotUiRegistry"] GodotUiRoot --> CanvasItemUiPageBehavior["CanvasItemUiPageBehavior"] GodotFileStorage --> NodeExtensions["NodeExtensions"] ``` 图表来源 - [IStorage.cs](file://GFramework.Core.Abstractions/storage/IStorage.cs#L1-L72) - [IFileStorage.cs](file://GFramework.Game.Abstractions/storage/IFileStorage.cs#L1-L9) - [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L1-L258) - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L1-L291) - [IUiFactory.cs](file://GFramework.Game.Abstractions/ui/IUiFactory.cs#L1-L87) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L1-L463) - [IUiRoot.cs](file://GFramework.Game.Abstractions/ui/IUiRoot.cs#L1-L43) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L1-L142) - [GodotUiRegistry.cs](file://GFramework.Godot/ui/GodotUiRegistry.cs#L1-L12) - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L1-L113) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L1-L259) ## 性能与最佳实践 - 文件存储 - 使用GodotFileStorage的线程安全特性,避免并发读写冲突 - 大文件读写建议结合异步接口,减少主线程阻塞 - res://路径优先用于打包资源,user://用于用户数据持久化 - UI缓存 - 预加载高频页面,隐藏状态进入池中,降低首帧延迟 - 合理设置最大缓存与淘汰策略(LRU/LFU),平衡内存与命中率 - 使用CanvasItemUiPageBehavior统一生命周期,避免重复处理与输入 - 节点管理 - 使用QueueFreeX延迟释放,避免当前帧删除导致崩溃 - 通过GodotUiRoot统一Z序,避免复杂层级导致的渲染问题 - 作用域与隔离 - 使用ScopedStorage为不同模块或玩家数据添加前缀,避免键冲突 [本节为通用指导,无需列出章节来源] ## 故障排查指南 - 文件读取异常 - 检查路径合法性:键中不得包含“..”,非法字符会被清理 - res://路径需确保资源已打包,user://路径需确认写入权限 - UI页面无法显示 - 确认页面节点已添加到GodotUiRoot容器,且Z序正确 - 检查CanvasItemUiPageBehavior的显示/隐藏状态与模态设置 - 节点释放问题 - 使用QueueFreeX而非Immediate Free,避免帧内删除 - 缓存命中率低 - 调整缓存配置(最大容量、淘汰策略),观察统计信息 章节来源 - [GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L85-L114) - [GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L59-L89) - [CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L82-L96) - [NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L14-L27) - [GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L162-L177) ## 结论 本指南梳理了Godot平台下的资源管理体系:文件存储、场景注册、UI工厂与根节点控制,并给出了缓存策略与节点管理的最佳实践。通过抽象接口与平台实现的分层设计,既保证了跨平台一致性,又充分利用了Godot的特性(如PackedScene、CanvasItem、FileAccess)。建议在实际项目中结合预加载、缓存与异步策略,持续监控缓存命中率与内存占用,以获得更稳定的用户体验。 [本节为总结性内容,无需列出章节来源] ## 附录:集成与使用示例 - 注册Godot模块(挂载UI根节点) - 参考:AbstractGodotModule的Install/OnAttach钩子,将GodotUiRoot挂载到场景树 - 参考文件:[AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs#L39-L54) - 使用GodotFileStorage - 读取:Read(key) 或 Read(key, defaultValue) - 写入:Write(key, value) - 删除:Delete(key) - 参考文件:[GodotFileStorage.cs](file://GFramework.Godot/storage/GodotFileStorage.cs#L164-L188) - 使用GodotUiFactory - 创建:Create(uiKey) 或 GetOrCreate(uiKey, UiInstancePolicy) - 预加载:Preload(uiKey, count) - 回收:Recycle(page) - 配置:SetCacheConfig(uiKey, UiCacheConfig),查看统计:GetCacheStatistics() - 参考文件:[GodotUiFactory.cs](file://GFramework.Godot/ui/GodotUiFactory.cs#L67-L97) - 使用GodotUiRoot - 添加页面:AddUiPage(child) 或 AddUiPage(child, layer, orderInLayer) - 设置Z序:SetZOrder(page, zOrder) - 参考文件:[GodotUiRoot.cs](file://GFramework.Godot/ui/GodotUiRoot.cs#L59-L89) - 使用CanvasItemUiPageBehavior - 显示/隐藏:OnShow/OnHide - 暂停/恢复:OnPause/OnResume - 参考文件:[CanvasItemUiPageBehavior.cs](file://GFramework.Godot/ui/CanvasItemUiPageBehavior.cs#L82-L96) - 使用NodeExtensions - 安全释放:QueueFreeX(node) - 等待ready:WaitUntilReady(node) - 参考文件:[NodeExtensions.cs](file://GFramework.Godot/extensions/NodeExtensions.cs#L14-L27)