Split mesh artifacts into material and texture artifacts

This commit is contained in:
2026-04-02 19:36:16 +08:00
parent b2d0570b1b
commit e30f5d5ffa
12 changed files with 939 additions and 135 deletions

View File

@@ -14,8 +14,8 @@
| 阶段 3TextureImporter | 已完成 | 已支持纹理导入为 `xctex`,运行时可直接从 artifact 读取,不再总是解码原始图片。 |
| 阶段 4ModelImporter | 已完成(初版) | 已支持模型导入为 `xcmesh`,并缓存模型关联纹理的 `xctex``ResourceManager` 会优先走 artifact。 |
| 阶段 5Material 系统 lazy 引用化 | 部分完成 | 已补齐材质序列化所需的 tag/property/texture binding 访问接口,但仍是 eager 贴图加载,未完成真正的延迟纹理解析。 |
| 阶段 6Scene / Component 引用迁移 | 部分完成 | `MeshFilterComponent``MeshRendererComponent` 已开始双写路径和 `AssetRef`可兼容旧格式读取。Scene 全量格式迁移尚未完成。 |
| 阶段 7异步导入与异步加载 | 未开始 | 当前导入与大资源加载仍发生在主线程,是仍会卡 editor 的直接原因。 |
| 阶段 6Scene / Component 引用迁移 | 部分完成 | `MeshFilterComponent``MeshRendererComponent` 已开始双写路径和 `AssetRef`并已在 editor 场景打开路径接入延迟恢复。Scene 全量格式迁移尚未完成。 |
| 阶段 7异步导入与异步加载 | 部分完成 | `AsyncLoader` 已具备真实 worker 线程与主线程 completion pumpeditor 打开 scene 时已改为 deferred restore但通用导入队列、placeholder/UI、全资源类型异步化尚未完成。 |
| 阶段 8清理、GC、工具与可视化 | 未开始 | 还没有 Reimport All、依赖图查看、orphan artifact 清理、导入面板等工具。 |
### 0.2 本轮已经落地的具体内容
@@ -25,18 +25,21 @@
- `TextureLoader` 已支持 `xctex``MeshLoader` 已支持 `xcmesh`,从而把“导入”和“运行时加载”从代码路径上拆开。
- `ProjectManager` 已支持忽略 `.meta` 文件显示,并在资源删除、移动、重命名时携带 `.meta` sidecar。
- `MeshFilterComponent``MeshRendererComponent` 已开始从纯路径引用迁到 `AssetRef`,目前是“旧路径兼容 + 新引用双写”模式。
- `AsyncLoader` 已从空壳改为真实后台加载器,支持 worker thread、完成队列与主线程回调泵。
- editor 的 `SceneManager::LoadScene(...)` / `RestoreSceneSnapshot(...)` 已接入 deferred scene load scopescene 打开时不再在组件反序列化阶段同步恢复 mesh/material。
- `EditorWorkspace::Update(...)` 已开始逐帧 pump async completion`MeshFilterComponent` / `MeshRendererComponent` 现在会在资源真正完成后再接管 handle。
- 已为纹理 artifact、模型 artifact、组件 `AssetRef` 序列化补充回归测试。
### 0.3 已验证结果
- `Debug``texture_tests.exe` 已通过,覆盖 `.meta` 自动生成、`Library` 产物生成、二次 `EnsureArtifact` 不重复导入、按 `AssetRef` 再加载纹理。
- `Debug``components_tests.exe` 已通过,覆盖 `MeshRendererComponent``AssetRef` 双写序列化/反序列化,以及项目内材质按 `AssetRef` 恢复。
- `Debug``components_tests.exe` 已通过,覆盖 `MeshRendererComponent``AssetRef` 双写序列化/反序列化,以及项目内材质按 `AssetRef` 的 deferred async 恢复。
- `Release``mesh_tests.exe` 已通过,覆盖 `obj + mtl + 贴图` 导入为 `xcmesh + xctex`、二次导入命中缓存、按 `AssetRef` 再加载模型。
- `Release``XCEditor` 已构建通过。
### 0.4 当前版本仍然存在的限制
- 首次打开未缓存或失效的 `obj` 资源时仍会在主线程同步执行导入editor 会明显卡住
- editor 场景打开阶段虽然已经不再在组件反序列化里同步恢复大资源,但首次真正需要该资源时,若 artifact 缺失或失效,后台任务仍可能较重,且缺少显式进度/UI
- 即使已经命中 artifact当前模型 artifact 读取后仍会立即把关联贴图一起加载到内存,尚未做到材质纹理 lazy load。
- 首帧渲染阶段仍会发生 GPU 资源创建与上传,这部分也会带来一次性卡顿。
- `MaterialImporter` 还没有形成完整的独立 artifact 格式,材质系统仍处于过渡状态。
@@ -1447,8 +1450,11 @@ editor/src/AssetPipeline/
当前状态:
- 未开始
- 这是当前 editor 仍会被大 `obj` 场景卡住的首要剩余任务
- 部分完成
- `AsyncLoader` 已具备真实 worker thread、pending/completed queue、主线程 completion callback pump
- editor `SceneManager` 已在 `LoadScene(...)``RestoreSceneSnapshot(...)` 路径启用 deferred scene load scope。
- `MeshFilterComponent``MeshRendererComponent` 已支持“反序列化只恢复引用并提交异步请求,真正 handle 接管延后到完成回调之后”。
- 仍未完成通用 import job 系统、统一 placeholder 状态、批量队列调度、更多资源类型的异步恢复,以及失败/进度 UI。
## 阶段 8清理、GC、工具与可视化