Improvements to Model Level Of Detail (LOD)

Hi Developers,

We are excited to announce that our upgraded Model LOD has shipped! The upgrade involves increasing the Model LOD resolution and capturing the model’s shape and color more accurately, resulting in improved quality.

Example 1: Before (Top) & After (Bottom) Model LOD

Example 2: Before (Top) & After (Bottom) Model LOD

How to enable Model LOD

Model LOD allows experiences that have enabled streaming to have better visual quality for models that haven’t yet been streamed to the client. Without Model LOD when a model with parts is outside the streamed area and not present on the client nothing will be rendered for the model and it will be invisible. With Model LOD, a reduced resolution imposter mesh will be used for rendering.

Model LOD is implemented on a per-model basis, and the feature can be enabled by:

  1. Check StreamingEnabled under Workspace Property->Streaming

  2. Set LevelOfDetail property to StreamingMesh for a Model to generate LOD data.

How to upgrade

:warning: Warning: You cannot revert the upgrade once it’s saved. :warning:

  1. To upgrade a single model, simply choose the desired model, change its LevelOfDetail property to Disable, and then switch it back to StreamingMesh. This process will initiate the upgrade.

  2. We offer a script that enables batch upgrades of the LOD data.

descendants = game.Workspace:GetDescendants()

for _, descendant in pairs(descendants) do
	if descendant:IsA("Model") then
		if descendant.LevelOfDetail == Enum.ModelLevelOfDetail.StreamingMesh then
				descendant.LevelOfDetail = Enum.ModelLevelOfDetail.Disabled
				descendant.LevelOfDetail = Enum.ModelLevelOfDetail.StreamingMesh

Help us to continuously improve Model LOD

Thanks to your feedback, we would not have been able to achieve what we have with Model LOD without it.

That said, we are hoping to continuously improve our LOD generation algorithms. If you would like to participate in a study to test out new algorithms, please sign up here.

Thank you.


This topic was automatically opened after 10 minutes.

Is there a possibility that this could be brought to experiences that don’t use streaming enabled?
Maybe a function that toggles between a models streaming mesh and normal quality manually?

Is there a way to view the tri count of the generated streaming mesh? In the past the tri count of the streaming mesh would sometimes be higher than the original. Is there checks in place to prevent issues like that now?

When switching to Streamingmesh, is the generated mesh subject to moderation? In the past when I ran an ipairs loop to change the render fidelity of all the meshes in my game I quickly hit the moderation queue limit which caused an assortment of issues.


It’s great to see LoD is improved. Is there any chance that we can have a function that can change the LoD level of instances manually? this would be very useful for custom LoD systems. Currently, we remove the object or change it with a low-poly version manually.


Not entirely related to your question, but I figured I would mention Roblox already does this for terrain voxels in all experiences regardless of if StreamingEnabled is on or not.

So I think Roblox might be working towards what you’re asking for here, they just haven’t gotten to that point yet.


The second set of screenshots have such a huge difference, at least to me! This is great.


Similar to replies above, model LOD should be accessible even if you don’t use streaming enabled, I don’t use it because I need all parts to be on the client at all times, but I would still like to be able to use the LOD system.


Roblox has actually recently released something to allow you to enable certain models on the client at all times, a really good way to keep the parts you need clients to always see, but also still use streaming enabled New Improvements to Streaming Enabled

These look a lot better than the previous ones to the point I might actually lower how far models are streamed in my game:

How the area normally looks when streamed in for comparison

The LODs match the look of the buildings a lot more, even capturing details like their color and their roofs (you can click on one of the images and click on the “next” arrow to compare). One feature I’d like to have is the ability to see how the LODs look up close in Studio without needing to play the game & getting far away from models.


Please also give us the ability to create manual LOD’s. This could allow us to make larger distant features still be performant but still look decent. :smiley:


:bowing_woman:t2: Kon’nichiwa!

Simple question which I think many may be curious about.

Does this change affect performance?

i.e. Was the older version better for performance? Is there not much of a difference? What should we take note of as developers?

Yeah I want to know about performance too, especially for mobile devices


I haven’t been able to notice any changes in a live game upon upgrading the models.


You must use workspace.StreamingEnabled

1 Like

This is cool and all but I still prefer to use my own LOD loading method for now. This is good for people who don’t have the bandwidth to make their own LOD models and script to load them though.


Yep that is known for “Streaming Mesh”

1 Like

Nice update! I think this would be better for lower-end devices (phones and tablets). Over all good update and I see a lot of potential for this

1 Like

Thanks! This is awesome! In the future, can there not be a manual upgrade step. I understand why it’s required now, but it’s kind of annoying!

Anyway, thank you for doing this!


Sorry in advance, I don’t know anything about rendering.
My laptop has framerate issues with Roblox but not other games because it seems Roblox’s optimization is not the best.
Will this new feature impact the optimization of games?

1 Like

Overall, it looks really good, as you can see from the tree mesh.
But I think the bigger the structures gets, it more falls back into the old LOD type.


Since the update, I’ve noticed that grouped objects start to move a tiny bit when I move them around the map, which makes it really annoying.

Before moving:

After moving around the map: