CreateMeshPartAsync stalls the main thread ~20 ms on first use of new DataModelContent

In Studio Play client tests, the first AssetService:CreateMeshPartAsync() call using newly generated static Content from CreateDataModelContentAsync consistently causes an approximately 20 ms main-thread stall, even for a mesh containing only two triangles.

Creating a MeshPart directly from the EditableMesh is much faster. Reusing the same static Content is also fast, but generating another static Content from identical geometry brings the first-use penalty back. Multiple first-use conversions can accumulate within a frame.

Reproduction in MeshCreationRepro.rbxlx (3.7 KB). After a 10-second startup delay, the script compares direct EditableMesh creation, first use of newly generated static Content, and reuse of that same Content. Results are displayed on-screen.

The reproduction uses two triangles, CollisionFidelity.Box, and RenderFidelity.Precise. Generated MeshParts remain unparented. It requires no uploaded assets, HTTP requests, or project-specific scripts.

Standalone results:

  • Uninstrumented first-use calls: 19.568–21.440 ms.
  • Uninstrumented reuse calls: 0.135–0.161 ms.
  • A separate focused MicroProfiler capture contains all four first-use markers on RBX Main, lasting 20.450–21.379 ms.
  • Maximum adjacent render intervals for those calls: 29.635–33.525 ms.
  • No RenderStepped callbacks occurred during those calls.

The profiler markers wrap CreateMeshPartAsync itself. API elapsed time and adjacent frame intervals were recorded separately. Occasional unrelated long frames also occurred in direct controls; we are not attributing every frame spike to this API.

Earlier isolated benchmarks showed the same pattern across mesh sizes:

Triangles Direct EditableMesh Fresh static Content Reused static Content
2 0.763 ms 21.294 ms 0.597 ms
512 0.759 ms 21.281 ms 0.695 ms
8,192 3.056 ms 23.764 ms 2.724 ms

These are medians from eight direct/fresh trials and seven warm reuse trials. Geometry preparation was outside the timed calls.

Waiting up to one second after creating static Content, warming it through CreateEditableMeshAsync, and creating a direct MeshPart before freezing did not remove the penalty. Reusing the same Content remained fast after destroying its previous MeshPart.

Environment:

  • Observed 20 September 2026, regression onset unknown.
  • Studio 0.739.0.7390687.
  • Windows 11 Pro, build 22631.
  • Intel Core i7-10700K, 32 GB RAM.
  • NVIDIA GeForce RTX 3070, driver 32.0.16.1088.

Testing limitations: Studio Play client only; standalone Roblox client and other devices have not been tested. Studio plugins were enabled and have not been independently ruled out. The engine-internal cause is unknown.

Related discussion:

Expected behavior

Converting a tiny, locally generated static mesh into a MeshPart should not introduce an approximately 20 ms fixed main-thread stall on first use. If preparation requires that time, the asynchronous operation should allow rendering to continue wherever possible.

A private message is associated with this bug report

2 Likes

Der Fehler liegt in der Roblox-Engine bei AssetService:CreateMeshPartAsync(). Der erste Aufruf mit neu erzeugtem statischem Content aus CreateDataModelContentAsync() verursacht eine Blockade des Hauptthreads von etwa 20 ms, selbst bei einem Mesh mit nur zwei Dreiecken. Die direkte Erstellung aus EditableMesh und die Wiederverwendung desselben Contents sind deutlich schneller. Das Problem ist daher die First-Use-Konvertierung und nicht die Geometrie oder das Skript selbst.

Bumping this. Would love to release a voxel building game with EM, but it’s currently unusable in a dynamic game due to this issue. @RbxWillingham, could you perhaps take a look at this?

1 Like

also experiencing this issue in my projects, it’s killing my game so would love to know when this is fixed

I’ve made an improvement for how AssetService:CreateMeshPartAsync interacts with DataModel Content. I’m no longer able to repro this issue, but please take a look and let me know if you’re still seeing it.

Thanks again for the report!

1 Like