This is a technique used by several games already, but in order to fully understand how this impacts performance, it’s important that there are roughly speaking 3 factors that determine the performance of a device running your game:
- How much is currently being displayed in the Workspace (i.e. your active map)
- How much data is stored in other locations such as ReplicatedStorage
- How much data is being communicated over the network
Your technique ensures that only the appropriate detail level of the map is visible in the workspace, and thus decreases rendering resources on lower-end devices. That’s great! But, depending on the size of your map, you are now storing two (potentially really big!) versions of your map in ReplicatedStorage. This means that a mobile device loading into your game, does also load the fully-detailed version of your map into storage. This doesn’t directly impact FPS or Physics, but does increase the chance of devices quitting the game because they run out of memory.
Something you could do, is to have the low-detail version in the Workspace from the start, and make an overlay model that includes the more high-detail assets you want to load if the client is on a PC or Xbox. You could then store this model in the ReplicatedStorage, which would be an improvement. Or, you can break up all the models in your map and store them individually, and then spawn them in on predefined locations to prevent storing 100+ tree models in ReplicatedStorage memory. We used that ‘instancing’ method for VentureLand and it greatly helped reduce resources, plus it allowed us to write a system that spawns models close to the player, and removes them once they are far away. That allowed us to get much more detail into the world without using too much resources.
If you want to go even more advanced, you want to lower the resources for the first two factors, and utilize the third (Network communication) to stream models to your client. I would advise against using StreamingEnabled unless you are 100% sure you know what you are doing, but generally speaking it is a good idea to not have copies of the map stored in client memory that the player isn’t likely to see any time soon. If you have an outdoor world that leads to various indoor locations, you could store those indoor locations on the server and only send them to the client when the client is about to enter the location. There is unfortunately not a built-in way to do this, but you can parent models to Player.PlayerGui to replicate something exclusively to one player. If you would like Roblox to build in better support for this type of streaming, you should head over to Custom replication via Zones/Scenes and give it some support.
Lastly be aware that, when the client loads the map locally, the server doesn’t see the geometry and might as well think that your players are now floating in mid-air. This is something to keep in mind when designing your game and programming it.