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:
2026-09-24 14:32:39 +08:00
parent 641f79d89e
commit 25a365fce7
9 changed files with 202 additions and 35 deletions
@@ -27,4 +27,11 @@ namespace Engine {
return m_Ibl.FromHdrEquirect(path, 1024);
}
Scope<Cubemap> VulkanAssetUploader::LoadEnvironment(
const std::string& path, DecodedEquirect&& decoded)
{
// 异步路径:decode 已在 worker 线程完成,此处只剩 GPU 段
return m_Ibl.FromDecoded(decoded, 1024, path);
}
} // namespace Engine