6.5 KiB
6.5 KiB
Asset
命名空间: XCEngine::Resources
类型: submodule
描述: 定义项目资产数据库、artifact 缓存、运行时资源加载、句柄、缓存与项目资产查询快照这一整套资源基础设施。
概述
当前 Core/Asset 已经不只是“运行时按路径加载资源”的薄层接口,而是可以分成三层来看:
- AssetDatabase
负责扫描项目
Assets、维护.meta、保存 source/artifact 索引,并在需要时把源资产导入成Library/Artifacts/...下的 artifact。 - AssetImportService + ProjectAssetIndex
负责把
AssetDatabase包装成线程安全服务,并导出供热路径查询使用的 path/GUID snapshot。 - ResourceManager
负责运行时加载、缓存、句柄与 loader 分发;当设置了项目根目录后,它会先经
AssetImportService准备 artifact,再通过ProjectAssetIndex做AssetRef/ 路径查询。
这意味着当前资源系统的真实链路是:
Assets/... source files
-> AssetDatabase
-> AssetImportService
-> ProjectAssetIndex snapshot
-> ResourceManager
-> concrete loader / runtime resource
其中,AssetGUID、AssetRef 和 ArtifactFormats 分别补上了“资产身份”“资产引用”和“artifact 磁盘格式”这三块基础协议。
当前实现关系
editor/src/Application.cpp初始化编辑器时会调用ResourceManager::SetResourceRoot(projectRoot),从而绑定项目根、初始化ResourceFileSystem,并刷新ProjectAssetIndex快照。ResourceManager::LoadResource()在加载项目资产时,会先调用AssetImportService::EnsureArtifact();只有 artifact 就绪后,才把ImportedAsset::runtimeLoadPath交给具体 loader。ProjectAssetIndex::TryGetAssetRef()当前会优先查本地 snapshot,cache miss 时再回退到AssetImportService;必要时会先Refresh()数据库再整体重建 snapshot。ProjectAssetIndex::TryResolveAssetPath()当前同样优先查 snapshot,但 miss 时只回退到AssetImportService::TryGetPrimaryAssetPath(),不会主动刷新整份 snapshot。engine/src/Resources/Material/MaterialLoader.cpp现在已经把材质纹理路径解析、.xcmat中的 textureAssetRef回读,以及首次访问时的懒加载纳入真实行为范围,因此AssetDatabase的材质依赖快照不再只是预留设计。.xcmat当前已经是 material artifact v2:texture binding 会同时写出编码后的AssetRef和可选路径字符串,后续由MaterialLoader与Material协作懒解析成真正贴图句柄。
设计要点
- 把“项目资产身份与导入缓存”和“运行时资源实例加载”拆成两层,避免
ResourceManager直接承载 GUID、.meta和 artifact 细节。 - 再引入
AssetImportService + ProjectAssetIndex作为服务层和只读快照层,把线程同步、项目根切换和高频查询从AssetDatabase与ResourceManager本体里拆出来。 AssetDatabase通过guid + importer + source/meta/dependency snapshot生成artifactKey,让重导入条件可复现。ResourceManager仍保留builtin://这类虚拟路径直载能力;只有能解析到项目Assets的路径才会进入项目资产链路。ResourceHandle、ResourceCache和AsyncLoader继续围绕运行时IResource实例运转,而不是直接把 source asset 当作运行时对象。
当前实现边界
AssetDatabase当前只有TextureImporter、MaterialImporter和ModelImporter会产出 artifact;FolderImporter和DefaultImporter只保留 source 记录。.meta文件当前只保存guid、folderAsset、importer和importerVersion,还没有持久化 importer 专属设置。ProjectAssetIndex当前只缓存主资产路径,生成的AssetRef仍默认使用kMainAssetLocalID。ResourceManager会在同步加载路径里触发 artifact 生成,但当前没有后台导入队列或文件监听闭环。LoadAsync()/AsyncLoader当前已经具备真实的工作线程与完成队列闭环,但回调仍依赖Update()手动轮询分发,取消与配置所有权语义也还比较原始。
头文件
- ArtifactFormats -
ArtifactFormats.h - AssetDatabase -
AssetDatabase.h - AssetGUID -
AssetGUID.h - AssetImportService -
AssetImportService.h - AssetRef -
AssetRef.h - AsyncLoader -
AsyncLoader.h - ImportSettings -
ImportSettings.h - IResource -
IResource.h - ProjectAssetIndex -
ProjectAssetIndex.h - ResourceCache -
ResourceCache.h - ResourceDependencyGraph -
ResourceDependencyGraph.h - ResourceHandle -
ResourceHandle.h - ResourceManager -
ResourceManager.h - ResourceTypes -
ResourceTypes.h
推荐阅读顺序
- 先读 AssetGUID 与 AssetRef,理解项目资产的身份与引用契约。
- 再读 AssetDatabase 与 ArtifactFormats,理解 source asset 如何导入为
Library/Artifacts下的 artifact。 - 然后读 AssetImportService 与 ProjectAssetIndex,理解数据库如何被包装成线程安全服务和热路径查询缓存。
- 接着读 ResourceManager 与 ResourceHandle,理解运行时如何消费这些 artifact 和 snapshot。
- 最后再看 ResourceCache、AsyncLoader 和 ResourceDependencyGraph,理解缓存、异步与依赖管理的现状。