Roblox expands SurfaceAppearance map inputs in Studio beta
Roblox’s Studio beta adds Asset ID and DataModel Content inputs for runtime SurfaceAppearances. Test memory use, creation latency and replication before planning adoption.
Roblox has expanded AssetService:CreateSurfaceAppearanceAsync in Studio beta to accept published Asset IDs and DataModel Content alongside EditableImages. The November 5, 2026 announcement affects developers creating materials at runtime, including customization and painting systems. Roblox plans to enable the feature in live experiences after initial feedback; this is not a live-game release.
Choose inputs by editing needs
According to Roblox, published image assets no longer need conversion to EditableImages for this method. The engine can transcode assets into a more efficient format, potentially lowering memory use. Developers can also combine different input types within the same material.
Roblox recommends converting generated images to DataModel Content once editing is finished. That format supports Texture Streaming and replication from server to clients. EditableImages remain useful for maps that keep changing: edits update the appearance without another creation call. However, server EditableImages still do not replicate. Clients see a checkerboard for an EditableImage map passed to the method on the server.
Test creation and replication
Our recommendation is to enable "Mixed Content for CreateSurfaceAppearanceAsync" under Beta Features in Studio’s File menu, then adapt an existing customization prototype this week. Use Asset IDs for fixed maps, DataModel Content for finished generated images, and EditableImages where continued editing is required. Compare memory use and inspect the result from clients.
Roblox warns that optimizing a new map combination containing DataModel Content or Asset IDs can take a few seconds on its first use in a session. We'd start by measuring that initial delay separately from later creation calls, then checking whether the customization interface needs a waiting state.