Real-Time Factor Significantly Slower When Running Isaac Sim as Standalone Python Script

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