Pre-release · M0 in progress

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.

Dev Tooling
USD Scene Layer
Runtime ECS
Simulation
Renderer Core
Vulkan Backend

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

Input events
Physics tick
ECS interpolation
GPU upload
Frustum cull
Shadow maps
G-buffer
Lighting
Post-process
Present

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.

MetricTargetCondition
Frame rate≥60 fps1440p on RTX 3080-class GPU
Streaming stall<2 msDuring async asset load
Multi-car scale20 vehiclesSimultaneous at 120 Hz physics
VRAM budget80% defaultLRU eviction under memory pressure
Cold start<10 secondsFirst frame from container boot
Scene load<5 seconds≥100k triangles with instancing
Replay fidelityBitwise identicalSame seed + event log, Linux + Windows

Tech stack

Every choice has a reason.

CategoryTechnologyRationale
LanguageC++23Standards-compliant, no extensions
Graphics APIVulkan 1.3GPU-first, lower-level control
ShadersSlang / HLSL → SPIR-VAvoids GLSL ecosystem fragmentation
Scene FormatOpenUSD 24.xIndustry standard for VFX and AV
WindowingSDL3Cross-platform, headless-compatible
ECSCustomCache-friendly SOA, no third-party overhead
BuildCMake 3.25+Cross-platform, generator-agnostic
GPU MemoryVMAIndustry standard Vulkan memory allocator
PhysicsJolt Physics 4.xApache 2.0, deterministic, used by AV teams
SerializationFlatBuffersZero-copy reads, schema versioning
ScriptingPython · Luapybind11 for Python, Lua for lightweight hooks
ProfilingTracyGPU + 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.