feat: 模型异步加载——assimp 解析移后台线程(SunTemple 3s 卡顿消除)
Model 拆两段式:ParseFromDisk(static 纯 CPU,assimp 解析 → 几何 + 材质引用,worker 可调)/ FromParsed(GPU 构建:纹理上传 / mesh 缓冲 / 材质描述符,主线程),同步路径等价两段串行。第二个异步任务类型落地, 线程收割骨架抽成 Core/AsyncTask<T>(thread + atomic + Take,覆盖式 Run;pending 接力语义留调用方)。 实测(SunTemple 1056 mesh):解析 2.5s 全程在 worker,主线程持续 渲染;GPU 构建 0.56s。assets 层经 IAssetUploader/AssetManager 重载 传预解析产物(路径缓存去重,路径已缓存则产物丢弃)。 已知边界:纹理解码(backpack 4k PNG ~1s)仍在 GPU 段主线程—— Texture 需支持预解码像素注入,后续演进。
This commit is contained in:
@@ -20,6 +20,17 @@ namespace Engine::Assets {
|
||||
[this](const std::string& p) { return m_Uploader.LoadModel(p); });
|
||||
}
|
||||
|
||||
ModelRef AssetManager::LoadModel(const std::string& path,
|
||||
ParsedModel&& parsed)
|
||||
{
|
||||
// 预解析数据移交 loader(Load 同步调用 lambda,引用捕获安全);
|
||||
// 路径已缓存则 loader 不执行,parsed 自然丢弃(去重)
|
||||
return m_Models.Load(path,
|
||||
[this, &parsed](const std::string& p) {
|
||||
return m_Uploader.LoadModel(p, std::move(parsed));
|
||||
});
|
||||
}
|
||||
|
||||
ModelRef AssetManager::CreatePlane(f32 halfSize, u8 r, u8 g, u8 b)
|
||||
{
|
||||
// 程序化资产复用同一缓存:键 = 伪路径 + 参数
|
||||
|
||||
Reference in New Issue
Block a user