架构分层(自上而下):
App(SandboxApp) → Application(生命周期+事件) → Scene(ECS) / AssetManager(句柄) → Renderer → RenderGraph → Vulkan 模块
- RenderGraph:声明式帧图。虚拟资源+生成号句柄、死 pass 剔除、
拓扑排序、资源生命周期、barrier 编译期预算(Synchronization2)、
物理镜像池按帧槽位隔离(帧间竞争从根上消除)
- 帧同步修复:per-frame-slot 命令缓冲与 UBO ring(原先单份存在
数据竞争);统一 kMaxFramesInFlight / FrameContext
- Application:生命周期钩子(OnInit/OnUpdate/OnRender/OnShutdown)
+ 事件系统(GLFW 回调 → POD 事件 → 类型化钩子);main 只 new 派生类
- ECS:自研稀疏集 Registry(Entity=(index,generation) 防悬空,
O(1) 增删查,Each 取最小池遍历);Scene 延迟销毁队列;
IdComponent{UUID} 稳定外部身份
- Assets:AssetManager + AssetHandle。组件存句柄不存裸指针/Ref
(单一所有者 + 多使用者),Renderer 删除 LoadModel 改为纯消费
- 修复退出析构:成员析构前 GPU waitIdle(资产层先于 Renderer
析构导致 VUID-00922 资源销毁时仍在使用)
- 引入 entt 子模块备用
validation 全程零错误零警告(RTX 5060 实测)
33 lines
925 B
C++
33 lines
925 B
C++
//
|
|
// Created by atdunbg on 2026/9/22.
|
|
//
|
|
// Entity:实体句柄 = (池内索引, 生成号)。
|
|
//
|
|
// 生成号用于甄别悬空引用:实体销毁后索引会回收复用,
|
|
// 旧的 Entity 句柄因 generation 不匹配会被 Registry 拒绝,
|
|
// 从机制上杜绝"引用到复用后的错误实体"这类隐式 bug。
|
|
//
|
|
|
|
#ifndef HELLOVULKAN_ENTITY_H
|
|
#define HELLOVULKAN_ENTITY_H
|
|
|
|
#include <Engine/Core/Types.h>
|
|
|
|
namespace Engine {
|
|
|
|
struct Entity {
|
|
static constexpr u32 kInvalid = 0xFFFFFFFF;
|
|
|
|
u32 index = kInvalid; // 实体槽位索引
|
|
u32 generation = 0; // 槽位复用计数
|
|
|
|
bool Valid() const { return index != kInvalid; }
|
|
explicit operator bool() const { return Valid(); }
|
|
bool operator==(const Entity& o) const = default;
|
|
bool operator!=(const Entity& o) const = default;
|
|
};
|
|
|
|
} // namespace Engine
|
|
|
|
#endif //HELLOVULKAN_ENTITY_H
|