Files
XCEngine/docs/api/resources/resource-file-system/index.md

89 lines
3.3 KiB
Markdown

# ResourceFileSystem
## 命名空间
`XCEngine::Resources`
## 类型
| 类型 | 名称 | 描述 |
|------|------|------|
| class | `ResourceFileSystem` | 资源文件系统管理器 |
| class | `IArchive` | 档案压缩包接口 |
| struct | `ResourceInfo` | 资源信息结构 |
## 概述
`ResourceFileSystem` 是 XCEngine 资源管理模块的核心组件,负责管理游戏资源的加载与访问。它支持从文件系统目录和档案压缩包(如 ZIP、Pak 等)中检索资源,并提供统一的资源访问接口。
该类采用单例模式,通过 `Get()` 静态方法获取全局实例。线程安全,通过内部互斥锁保护数据结构。
### 主要功能
- 支持多目录和多档案的资源来源
- 资源路径解析(相对路径 → 绝对路径)
- 资源读取(以字节数组形式返回)
- 资源存在性检查
- 资源元数据查询
- 资源枚举(支持通配符模式)
- 信息缓存以提高查询性能
## 公共方法表格
| 方法 | 签名 | 描述 |
|------|------|------|
| `Initialize` | `void Initialize(const Containers::String& rootPath)` | 初始化资源文件系统,设置根路径 |
| `Shutdown` | `void Shutdown()` | 关闭文件系统,释放所有资源 |
| `AddArchive` | `bool AddArchive(const Containers::String& archivePath)` | 添加档案压缩包作为资源来源 |
| `AddDirectory` | `bool AddDirectory(const Containers::String& directoryPath)` | 添加目录作为资源来源 |
| `RemoveArchive` | `void RemoveArchive(const Containers::String& archivePath)` | 移除指定的档案压缩包 |
| `FindResource` | `bool FindResource(const Containers::String& relativePath, Containers::String& outAbsolutePath) const` | 查找资源并返回绝对路径 |
| `ReadResource` | `Containers::Array<Core::uint8> ReadResource(const Containers::String& relativePath) const` | 读取资源数据 |
| `Exists` | `bool Exists(const Containers::String& relativePath) const` | 检查资源是否存在 |
| `GetResourceInfo` | `bool GetResourceInfo(const Containers::String& relativePath, ResourceInfo& outInfo) const` | 获取资源详细信息 |
| `EnumerateResources` | `void EnumerateResources(const Containers::String& pattern, Containers::Array<ResourceInfo>& outResources) const` | 枚举匹配模式的资源 |
| `Get` | `static ResourceFileSystem& Get()` | 获取单例实例 |
## 使用示例
```cpp
#include "Resources/ResourceFileSystem.h"
using namespace XCEngine;
using namespace XCEngine::Resources;
// 初始化资源文件系统
ResourceFileSystem& fs = ResourceFileSystem::Get();
fs.Initialize("C:/Game/Resources");
// 添加资源来源
fs.AddDirectory("C:/Game/Assets/Textures");
fs.AddArchive("C:/Game/Paks/Common.pak");
// 读取资源
Containers::Array<Core::uint8> data = fs.ReadResource("textures/player/diffuse.png");
if (data.Size() > 0) {
// 处理资源数据
}
// 检查资源是否存在
if (fs.Exists("shaders/forward.glsl")) {
// 加载着色器
}
// 获取资源信息
ResourceInfo info;
if (fs.GetResourceInfo("audio/bgm/main_theme.ogg", info)) {
printf("Resource size: %zu\n", info.size);
}
// 枚举资源
Containers::Array<ResourceInfo> resources;
fs.EnumerateResources("textures/**/*.png", resources);
```
## 相关文档
- [IArchive 接口](iarchive.md)
- [ResourceInfo 结构](resource-info.md)