The performance difference comes from different Kit app configurations loaded by the two launch paths:
- GUI (isaac-sim.sh) loads isaacsim.exp.full.kit, which enables rate-limited manual-mode stepping with fixed time stepping and async throttling. The Kit loop runner pipelines physics, rendering, and UI updates for optimal throughput.
- Standalone Python (SimulationApp) loads isaacsim.exp.base.python.kit, which disables rate limiting and fixed time stepping. Each world.step(render=True) becomes a fully synchronous blocking app.update() call with no pipeline overlap —
roughly half the throughput.
Fix — add these settings to your launch config:
config = {
"headless": False,
"extra_args": [
"--/app/runLoops/main/rateLimitEnabled=true",
"--/app/runLoops/main/rateLimitFrequency=60",
"--/app/runLoops/main/manualModeEnabled=true",
"--/app/player/useFixedTimeStepping=true",
]
}
simulation_app = SimulationApp(launch_config=conf ig)
This aligns the standalone loop runner behavior with the GUI and should bring your RTF back to ~0.6.
Alternative approaches:
- If you don’t need rendering, use world.step(render=False) for physics-only stepping (much faster)
- You can also try enabling async rendering with --/app/asyncRendering=true and --/app/asyncRenderingLowLatency=true for pipelined rendering, though this is experimental and may introduce a one-frame lag in render product data