feat: 环境异步加载——HDR 解码移后台线程,运行时切换不卡主线程
decode 是切换耗时大头(4k ≈ 130-160ms),搬出主线程后运行时切换 只剩 GPU 段(~40ms)。IblGenerator 拆两段式:DecodeHdr(static, 纯 CPU 无线程状态,worker 可调)+ FromDecoded(GPU 生成,主线程); FromHdrEquirect 保留为同步便捷路径。Assets 层经 IAssetUploader 重载 + AssetManager 重载传递预解码产物(路径已缓存则丢弃去重)。 App 层单 in-flight 状态机:worker 只产出纯 CPU 像素数据,忙肋期 新请求记 pending 接力(只保留最终意图),OnUpdate 每帧收割 + SetEnvironment 换绑,析构 join。 实测(RTX 5060 Laptop,4 实例网格 + 运行中连切 3 环境): ~180fps 无感知尖峰;0 validation。
This commit is contained in:
@@ -37,4 +37,15 @@ namespace Engine::Assets {
|
||||
[this](const std::string& p) { return m_Uploader.LoadEnvironment(p); });
|
||||
}
|
||||
|
||||
EnvRef AssetManager::LoadEnvironment(const std::string& path,
|
||||
DecodedEquirect&& decoded)
|
||||
{
|
||||
// 预解码数据移交 loader(Load 同步调用 lambda,引用捕获安全);
|
||||
// 路径已缓存则 loader 不执行,decoded 自然丢弃(去重)
|
||||
return m_Environments.Load(path,
|
||||
[this, &decoded](const std::string& p) {
|
||||
return m_Uploader.LoadEnvironment(p, std::move(decoded));
|
||||
});
|
||||
}
|
||||
|
||||
} // namespace Engine::Assets
|
||||
|
||||
Reference in New Issue
Block a user