CPU 逐像素卷积(venice 4k 阻塞 7.36s)→ 4 个 compute shader 一次性 提交:equirect→cube / irradiance / prefilter×5mip / BRDF LUT。 Cubemap 瘦身为纯资源持有类,生成职责移交 IblGenerator; 环境经 AssetManager 缓存(EnvRef),Renderer::SetEnvironment 动态换绑(RenderPass::OnEnvironmentChanged 广播)。 调试视图 +4:EnvCube / Irradiance / Prefilter / BRDF LUT。 性能前后对比(RTX 5060 Laptop,venice_dawn_1_4k.hdr): - 改造前 CPU:7.36 s(主线程阻塞) - 改造后 GPU:HDR decode 127-134ms + 资源 22-35ms + compute 17-19ms ≈ 165-190ms(约 40×);Neutral 兜底 ~6ms - 运行中动态切换环境同量级(ms 级 GPU,decode 占大头) 冒烟:两构建目录 0 警告;运行期 0 validation(含两次环境切换 + 调试视图 9-12 轮播自动化验证)。
48 lines
1.5 KiB
C++
48 lines
1.5 KiB
C++
//
|
|
// Created by atdunbg on 2026/9/23.
|
|
//
|
|
// AssetRef:中性资产引用 = (池内索引, 生成号),与 Entity/RG 句柄同一哲学。
|
|
//
|
|
// 放在 Core 层(不依赖 Assets/Vulkan):ECS 组件、序列化数据只存这个
|
|
// 纯值类型。对齐 UE/Unity 的做法——组件持有"资产引用",但不感知资产
|
|
// 系统内部:Unity 的 InstanceID、UE 的 FSoftObjectPath 本质都是中性引用
|
|
// 值,解析归资产系统(AssetManager)。
|
|
// 悬空引用(generation 不匹配)由 AssetCache::Get 显式拒绝。
|
|
//
|
|
|
|
#ifndef HELLOVULKAN_ASSETREF_H
|
|
#define HELLOVULKAN_ASSETREF_H
|
|
|
|
#include <Engine/Core/Types.h>
|
|
|
|
// 资产类型前向声明(必须放全局层:namespace 内前向声明会创建
|
|
// Engine::Assets::Engine::Model 这类错误嵌套命名空间)
|
|
namespace Engine {
|
|
class Model;
|
|
class Cubemap;
|
|
class Texture;
|
|
class Material;
|
|
}
|
|
|
|
namespace Engine {
|
|
|
|
inline constexpr u32 kInvalidAssetIndex = 0xFFFFFFFF;
|
|
|
|
template<typename T>
|
|
struct AssetRef {
|
|
u32 index = kInvalidAssetIndex;
|
|
u32 generation = 0;
|
|
|
|
bool Valid() const { return index != kInvalidAssetIndex; }
|
|
explicit operator bool() const { return Valid(); }
|
|
bool operator==(const AssetRef& o) const = default;
|
|
};
|
|
|
|
// 常用别名(新增资产类型时在这里加一行)
|
|
using ModelRef = AssetRef<Model>;
|
|
using EnvRef = AssetRef<Cubemap>; // 环境(IBL 四件套)
|
|
|
|
} // namespace Engine
|
|
|
|
#endif //HELLOVULKAN_ASSETREF_H
|