IsaacSim 5.1 hangs with external MDL material loading plus full experience file

Isaac Sim Version

5.1.0

Operating System

Ubuntu 22.04

GPU Information

  • Model: RTX 3090
  • Driver Version: 575.64.03

Topic Description

Detailed Description

In IsaacSim 5.1, If I create a material from a MDL file, the simulation will hang when I call sim.reset(), and with full experience file
No such problem in IsaacSim 5.0

Code:

import os
import isaacsim

use_full_exp_file = True
simulation_app = isaacsim.SimulationApp(
    launch_config={"headless": False},
    experience=os.path.join(os.path.dirname(isaacsim.__file__), "apps/isaacsim.exp.full.kit") if use_full_exp_file else "",
)


import omni
from pxr import UsdGeom
from isaacsim.core.api import SimulationContext


def create_minimal_mdl_material():
    stage = omni.usd.get_context().get_stage()
    
    # Get the path to the minimal MDL file
    script_dir = os.path.dirname(os.path.abspath(__file__))
    mdl_path = os.path.join(script_dir, "minimal_test.mdl")
    
    print(f"  MDL file: {mdl_path}")
    print(f"  File exists: {os.path.exists(mdl_path)}")
    
    # Create material
    UsdGeom.Scope.Define(stage, "/World/Looks")
    material_path = "/World/Looks/TestMaterial"
    
    omni.kit.commands.execute(
        "CreateMdlMaterialPrim",
        mtl_url=mdl_path,
        mtl_name="MinimalMaterial",
        mtl_path=material_path,
        select_new_prim=False,
    )
    
    print(f"  ✓ Material created at: {material_path}")


def demonstrate_bug():
    sim = SimulationContext(
        physics_dt=1/60, 
        rendering_dt=1/60, 
        backend='torch', 
        device='cuda:0',
    )
    create_minimal_mdl_material()
    
    print("  ⚠ THIS IS WHERE IT HANGS - IsaacSim will become unresponsive")
    
    sim.reset()
    
    # If we get here, the bug is fixed in your version
    print("  ✓ sim.reset() completed successfully!")

def main():
    demonstrate_bug()

if __name__ == "__main__":
    try:
        main()
    finally:
        simulation_app.close()

minimal_test.mdl:

mdl 1.5;

import ::base::*;
import ::df::*;
import ::anno::*;

export material MinimalMaterial()
[[
    ::anno::display_name("Minimal Material"),
    ::anno::description("Simplest possible MDL material for bug reproduction")
]]
= material(
    surface: material_surface(
        scattering: df::diffuse_reflection_bsdf(
            tint: color(0.5, 0.5, 0.5)  // Simple gray color
        )
    )
);

Additional Information

What I’ve Tried

Switch back to isaac sim 5.0 version, it works.
Or set the use_full_exp_file to false, it works

Hi @flm8620
we can reproduce the issue and an internal ticket has been created to track this. Thanks for reporting it!

Update: Workaround Confirmed & Additional Findings

I’ve found a workaround and additional context for this issue.

Root Cause Analysis:

The hang occurs when ALL of the following conditions are met:

  1. Async rendering is enabled (/app/asyncRendering = True)
  2. External MDL material is loaded (either directly via CreateMdlMaterialPrim or indirectly via USD assets that reference external MDL files)
  3. SimulationContext.reset() or initialize_physics() is called

The deadlock happens inside SimulationContext.play() which calls self._app.update() synchronously while the async rendering thread is blocked waiting for MDL material compilation.

Workaround:

Disable async rendering before calling reset() or initialize_physics():

import carb

settings = carb.settings.get_settings()
settings.set("/app/asyncRendering", False)
settings.set("/app/asyncRenderingLowLatency", False)

sim.reset()  # Now works without hanging

Additional Finding:

This issue also affects USD assets that internally reference external MDL materials. In my RL training project, loading a wood crate USD asset (which uses external MDL materials) caused the same hang, while assets using only built-in OmniPBR materials worked fine.

Affected configurations:

isaacsim.exp.full.kit (has async rendering enabled by default)
Any custom kit file with exts.“isaacsim.core.throttling”.enable_async = true

Not affected:

Default experience file without async rendering
Assets using only built-in materials (e.g., FixedCuboid, DynamicCuboid)
Hope this helps others encountering the same issue!

Hi @flm8620, We independently verified your root cause analysis on Isaac Sim 5.1.0 (RTX 6000 Ada, driver 580.126.09, Ubuntu). Your findings are spot-on. Here’s what we confirmed:

Test Results: - Default experience + external MDL → sim.reset() completes in ~6s - Full experience + external MDL → sim.reset() deadlocks indefinitely

  • Full experience + external MDL + your workaround → sim.reset() completes in ~0.1s
    Root Cause (verified via source): The chain is: 1. isaacsim.exp.full.kit sets exts.“isaacsim.core.throttling” .enable_async = true 2. The throttling extension (isaacsim.core.throttling/extension.py) on startup reads this and sets /app/asyncRendering = True + /app/asyncRenderingLowLatency = True
  1. When you call SimulationContext.reset() → it calls play() → which calls self._app.update() synchronously on the main thread
  2. With async rendering enabled, _app.update() needs to synchronize with the render thread to complete one frame – but the render thread is blocked doing neuraylib MDL compilation for the external material 5. Deadlock: main thread waits on render thread (frame sync), render thread is stuck compiling MDL and can’t yield back

The default experience file (isaacsim.exp.base.kit) explicitly sets asyncRendering = false and asyncRenderingLowLatency = false, which is why it works there.

Your workaround is correct: import carb

settings = carb.settings.get_settings()

settings.set("/app/asyncRendering", False)

settings.set("/app/asyncRenderingLowLatency", False)

sim.reset() # Works without hanging This forces synchronous rendering so MDL compilation happens inline during _app.update() rather than on a contended async render thread.