|
Vulkan Schnee 0.0.1
High-performance rendering engine
|
Vulkan Schnee uses EnTT for high-performance data-oriented ECS, combined with wrapper classes for game logic.
entt::entity is a lightweight handle (32-bit integer). Entities own components stored in the registry.
Ecs::RegistryManager::get() provides access to the global EnTT registry. All component data lives here.
Components are pure data structs in the Ecs namespace (defined in Engine/include/Engine/Ecs/EcsData.h).
Vulkan Schnee uses composition for data, inheritance for type safety.
Data layer: EnTT components store raw data for cache-friendly iteration. Logic layer: C++ classes wrap entities and provide game logic.
EngineCore::Entity wraps an entt::entity handle.
Fields:
Usage:
Entities register themselves for ticking:
EngineCore::Actor extends Entity with transform and scene graph.
Additional fields:
Usage:
Actors live in the scene graph. Transform changes propagate through hierarchy.
Scene graph transforms sync to ECS:
Renderer iterates ECS components directly (no wrapper overhead):
Game logic uses wrappers: Actor, MeshComponent, Scene.
Purpose:
Access pattern:
Renderer uses ECS directly for hot loops.
Purpose:
Access pattern:
Transform changes use two-stage dirty tracking:
Stage 1: Scene graph sync
Stage 2: GPU upload
Separation prevents race conditions when transforms change during tick.
Asset pipeline uses staged components:
| File | Purpose |
|---|---|
| Engine/include/Engine/Ecs/EcsData.h | All ECS component definitions |
| Engine/include/Engine/Ecs/RegistryManager.h | Registry singleton |
| Engine/include/Engine/Entity/Entity.h | Base wrapper class |
| Engine/include/Engine/Entity/Actor.h | Transform wrapper |
| Engine/src/Engine/Ecs/FrameProcessing.cpp | Asset loading pipeline |
| Engine/src/Engine/Renderer/RenderingDataManager.cpp | Rendering queries |
EnTT provides O(1) component access and cache-friendly iteration. Use wrappers for game logic, ECS for hot loops.
Wrapper overhead: Acceptable for tick/input (runs once per entity per frame). ECS direct access: Required for rendering (processes thousands of primitives per frame).
Transform hierarchy sync runs once per frame before rendering. Dirty flags minimize work.