Atomic Models not Streaming Out

We have a massive Skiing Slope, that is thousands of studs away, it used to only fully load when you teleport to the area, now many of our maps are loading on spawn and always visible.

  1. Used to not load at all from far away
  2. Only affects Atomic Models

Here is an example:
Bug.rbxl (126.9 KB)

It’s very easy to replicate, hit play and look at the model called “TestModel”

Interesting Fact:

  1. Go to: Workspace.TestModel.ResizeTheseParts ← select all children
  2. Make them size 10,10,10
  3. Play again, it won’t load on spawn anymore.

Extra Information:
It’s happening to our main game Morph World on all our Dev’s PCs. It used to not happen a few weeks ago.

Expected behavior

Only load the model if you are close to it.

2 Likes

If you have a MeshPart that is larger than 2048 studs in any dimension then we may treat that MeshPart as persistent. If the MeshPart is part of an atomic model this will result in the entire model being treated as persistent.

Is it possible for you to ensure that none of your MeshParts are larger than 2048?

2 Likes

Hello @CorvusCoraxx
Yes, that was our previous knowledge, but something has changed in the past weeks.
Could you try to replicate the instruction on the post?
As you can see all these meshes are Size 50x50x50
If you make them size 10x10x10 the bug will dissapear.

The map is huge and without clear rules it is extremely difficult to order any changes to the team.

I ran a script on all descendants searching for sizes > 2048, there are none, i believe it is not possible to do so, we never could reach such sizes, one of our developers had issues with the 1024 threshold in the past tho, it seemed to have lowered, which seems to be another issue which i cannot confirm.

1 Like

Looking at those parts when we compute their sizes in the engine they all have some dimension that is larger than 2048:

Workspace.TestModel.ResizeTheseParts.6 size 1711.1719, 1445.6996, 2431.4238
Workspace.TestModel.ResizeTheseParts.Killzone size 2313.4922, 1648.8848, 2065.3193
Workspace.TestModel.ResizeTheseParts.10 size 1344.7031, 1061.3008, 2109.0889
Workspace.TestModel.ResizeTheseParts.Killzone size 1503.1562, 2336.8506, 2257.296
Workspace.TestModel.ResizeTheseParts.4 size 1344.7031, 1061.3008, 2109.0889
Workspace.TestModel.ResizeTheseParts.5 size 2214.6172, 1869.4912, 1815.1294
Workspace.TestModel.ResizeTheseParts.3 size 2214.6172, 1869.4908, 1815.1294
Workspace.TestModel.ResizeTheseParts.8 size 1328.9297, 1061.3015, 2100.3787
Workspace.TestModel.ResizeTheseParts.12 size 1209.3516, 2233.9734, 2126.5146
Workspace.TestModel.ResizeTheseParts.9 size 1355.3438, 1406.1743, 2265.2688
Workspace.TestModel.ResizeTheseParts.2 size 1626.9922, 2398.5186, 2267.0916
Workspace.TestModel.ResizeTheseParts.1 size 1215.125, 2220.9465, 2152.3984

Looking at those parts in Studio it seems like none of those MeshParts have a MeshId or MeshContent. I’m not actually familiar with how MeshParts that don’t have MeshId’s are handled. Did these MeshParts have actually meshes attached in the past? If I do attach meshes to them then the sizes are reasonable and the model no longer is treated as persistent.

I rolled back to when they had meshIDs, selected every mesh and made them 2000,2000,2000
Bug Still happening. Althrough when it’s 1000,1000,1000 it doesn’t.

Also if i add a regular part/cube size 2048 it is treated as persistent again.
If the cube is size 2047 it doesn’t.

Is there a clear number or method we can deliver to the team to proceed with these changes?
I know some models push bounduaries of the engine, but it is very hard to provide changes when you don’t know how much is enough.
Perhaps a warning saying a part is being treated as persistent? or a code that could check for that issue. Any tool that could help us, thank you!

If you can provide me a place id of where you want to do your testing/editing I can enable some logging to indicate what parts are causing the models to be treated as persistent. It will only show the first part that exceeds the limit inside the atomic model, but it should allow you to iterate and identify all the problematic meshparts.

Thank you @CorvusCoraxx !
Our place id is: 14863948290
https://www.roblox.com/games/14863948290/TEST-SERVER-morphworld

I’ve enabled the logging on that place id. You want to look in the logs for something like “Part X is too large, treating as persistent”

For context, I am adding this here, as it may be related.

Hey @CorvusCoraxx
Managing this issue has been really hard to the team, thank you for your time helping us out.
workspace.TestHere.ThisModel"SCALE THIS PART"
Thats the 2048 part causing it to be persistent and 2047 size part causing it not to be.
Could the streaming team review this file? I think there is something wrong that started 2 weeks ago, mesh parts really became very sensitive to size when it comes to streaming, but now even regular parts have weird behaviour like that, doesn’t seem to be logical to have this property.

Bug_2.rbxl (116.9 KB)

I do see that parts that appear to be exactly 2048 in Studio somehow end up a bit larger than that when we access them deep in the engine code. I wonder if floating point precision issues are showing up somewhere.

At a high level is the issue you are concerned about is that parts are visible earlier than previously? There are efficiency reasons for us to treat these very large parts as persistent so we can avoid some spatial processing.

Our issue is that every zone in our game is loading in and being treated as persistent. 2 or so weeks ago, whatever system that changed in the back end is treating all of our atomic areas as persistent and loading all of our worlds at once. This is drastically effecting performance for our players.

We aren’t able to correct our worlds if the rules you are stating are not accurately being treated as the guideline. Is there perhaps a way to schedule a meeting for our devs Gustavo & Rich to receive hands on assistance from you or another team member?

The rules are that if any Part/MeshPart has a size in any dimension that is larger than 2048 that instance will be treated as persistent. If that instance belongs to an atomic model or to a mechanism then that model/mechanism will also be treated as persistent. Unfortunately it looks like that can be a bit tricky for instances right around the 2048 limit because when multiple transformations are applied in the engine floating point precision can get us over the limit.

Since it sounds like this change we rolled out is causing performance issues for your players what we can do is temporarily disable the change for your published experience to give your team some time to make changes to the parts that trigger this behavior. We can enable the additional logging on a private experience so that it is clear what parts are over the limit. That way you will have time (weeks or months) to make adjustments without impacting your player base.

Hello @CorvusCoraxx
I got a 1400,1400,1400 cube to cause it by itself, when orientation is removed from it, bug stops.
Bug_3.rbxl (100.2 KB)
workspace.TESTHERE.TestModel.THISCUBE

We are still doing some tests, parts.Size.Magnitude > 2048 seems to be close to the threshold for any angled part (not mesh), but it’s still not exact, it’s a few studs off

Thanks for pointing out this issue with rotated valid sized parts. This wasn’t the intended behavior and we will correct this.

In the meantime I would like to disable this behavior for your experience since it is causing issues. What is the place id we should disable it on?

2 Likes

Hello! @CorvusCoraxx
Thank you so much for taking your time for looking into it, our team really appreciates roblox’s effort.

This is our main server:

This is where we work:
https://www.roblox.com/games/14863948290/TEST-SERVER-morphworld

It would make sense to do it on both if you could.

We have disabled the behavior on both those experiences.