Vehicle Simulation Engine
A Vulkan-based, USD-native scene runtime and simulation platform. Starting with F1 racing. Expanding to ADAS, robotics, and synthetic data generation.
VSE is not a game engine. It is infrastructure — a modular runtime for engineers who need physics accuracy, render fidelity, and cloud scalability simultaneously.
Architecture
Strict layered dependency model.
Lower layers never depend on higher ones. The Vulkan backend has no knowledge of USD. The renderer has no knowledge of physics. Each layer can be used independently.
USD is loaded once at startup and translated to a flat, GPU-friendly ECS representation. No pxr:: types appear in runtime code — USD is the authoring format, not the simulation format.
The render graph describes the frame declaratively. Barriers, resource aliasing, and pass scheduling are computed from the graph — not written by hand.
Frame lifecycle
Subsystems
Each system is independently replaceable.
Render Graph
Declarative frame description. Automatic barrier insertion, resource aliasing, and pass culling. The frame is a data structure — not imperative code.
GPU Scene
ECS state mirrored to GPU: InstanceBuffer, MeshletBuffer, MaterialBuffer, LightBuffer. CPU submits one upload per frame. GPU handles the rest.
Visibility & Culling
Two-pass compute: frustum cull → Hi-Z occlusion cull → DrawIndirectBuffer. No per-draw CPU submission after the first frame. Bindless descriptors eliminate per-draw descriptor overhead.
Physics (Jolt)
Rigid body dynamics with VehicleConstraint. Full Pacejka tire model. Fixed-timestep deterministic simulation with seeded event logs for bitwise-identical replay.
Asset Streaming
Asynchronous geometry and texture loading. Mip-streaming with a configurable VRAM budget (default 80%). Streaming stalls under 2ms. LRU eviction under memory pressure.
Replay System
Initial state + per-tick input log + seed → deterministic re-run. Bitwise identical across Linux and Windows. Foundation for race analysis, regression testing, and synthetic data generation.
Performance targets
Targets verified at each milestone.
| Metric | Target | Condition |
|---|---|---|
| Frame rate | ≥60 fps | 1440p on RTX 3080-class GPU |
| Streaming stall | <2 ms | During async asset load |
| Multi-car scale | 20 vehicles | Simultaneous at 120 Hz physics |
| VRAM budget | 80% default | LRU eviction under memory pressure |
| Cold start | <10 seconds | First frame from container boot |
| Scene load | <5 seconds | ≥100k triangles with instancing |
| Replay fidelity | Bitwise identical | Same seed + event log, Linux + Windows |
Tech stack
Every choice has a reason.
| Category | Technology | Rationale |
|---|---|---|
| Language | C++23 | Standards-compliant, no extensions |
| Graphics API | Vulkan 1.3 | GPU-first, lower-level control |
| Shaders | Slang / HLSL → SPIR-V | Avoids GLSL ecosystem fragmentation |
| Scene Format | OpenUSD 24.x | Industry standard for VFX and AV |
| Windowing | SDL3 | Cross-platform, headless-compatible |
| ECS | Custom | Cache-friendly SOA, no third-party overhead |
| Build | CMake 3.25+ | Cross-platform, generator-agnostic |
| GPU Memory | VMA | Industry standard Vulkan memory allocator |
| Physics | Jolt Physics 4.x | Apache 2.0, deterministic, used by AV teams |
| Serialization | FlatBuffers | Zero-copy reads, schema versioning |
| Scripting | Python · Lua | pybind11 for Python, Lua for lightweight hooks |
| Profiling | Tracy | GPU + CPU zones, zero-cost when disabled |
Scope
What VSE explicitly is not.
Not a game engine
No asset editor, no blueprint graph, no content pipeline.
Not an offline renderer
Designed for real-time simulation, not cinematic ray tracing.
Not an Omniverse fork
No proprietary runtime dependency. USD is the interchange, not the lock-in.
Not ROS-native
VSE is a simulation substrate. ROS integration is a layer on top, not the foundation.
VSE ships publicly in April 2027.
Follow the build on the roadmap.