Industry Standard Rendering System : RenderStorage

Client-Side “RenderStorage": Alternative to ReplicatedStorage

I’ve been working on a large, detailed open-world map filled with vegetation, interiors, and props. Currently it is impossible to have such a map work on any mobile devices, alienating a large potential playerbase.

I attempted to build a manual rendering system using ReplicatedStorage, but instances stored there still:
- Consume client memory
- Appear in the Shift+F4 part count
- Exist on the client even when not in Workspace

This defeats the purpose of manually controlling what should and shouldn’t be loaded.

Right now, we effectively have two options:

StreamingEnabled
- Helps reduce memory usage
- Limits render distance for all objects
- Removes fine-grained control over what loads and when
- Objects still take up part count

For large open-world games, such as my project, Tasmarina City, this can negatively impact atmosphere and perceived world scale.

ServerStorage
- Avoids client memory usage
- Isnt designed for client-side rendering services
- Doesn’t work well with 60 player servers, and doesn’t seem to be very optimized

In summary, there’s no proper way to unload and load props or other smaller high detail objects without tanking server preformance, or killing render distance. (which ruins sightlines, views, and high speed driving as a whole)

My solution? A new “service” under properties called RenderStorage, and maybe even add a RenderService to mirror ServerStorage and ServerScriptService.

We need a new space that:
- Does not replicate instances to the client until explicitly moved (with scripts)
- Does not consume client memory
- Allows developers to manually move instances into Workspace (with scripts)
- Enables custom LOD and render-distance systems (per folder, type, tag, etc.)
- Supports mobile devices, even on large (but optimized) maps
- Manual rendering system that can work with and manage hundereds of thousands of instances within one place file
- Works alongside StreamingEnabled, not as a replacement!

This would allow developers to build advanced rendering systems similar to Unity, or Unreal Engine. We know Roblox is seeming to pivot into a more “realistic” art style, but this isnt really possible due to the lack of good rendering systems that other game engines have.

Why RenderStorage is Essential

Large open world maps, especially those such as mine that are focused on driving, are pretty much impossible to make. Yes, you can split it into multiple places, but that creates a closed off feeling, and is not a real alternative.

Right now, the tradeoff is:
- Keep environmental detail and hurt performance
or
- Use StreamingEnabled and sacrifice precision control

For developers building immersive, detailed maps, just like me, that’s a MAJOR limitation.

Roblox Studio is very acessible, but I may be forced to move off-platform to develop the type of game I am trying to make.

Allowing more control for how developers render assets within their games will do nothing but help creativity, drive passion, and bring “AAA feeling” maps to the platform.

I’m open to any questions, comments, or concerns that anyone may have

If any high profile developers / anyone working at roblox wants to implement this feature, feel free to contact me and I will try to provide more detail and background

NOTE: This is a heavily changed revision to my previous edit. I hope this is more clear as I’ve dug into the issue more and have pointed out exactly what I need!

6 Likes

YES! More customization for instance streaming would be awesome. Anyone making an open-world game would greatly benefit from more control over StreamingEnabled.

It sounds like your main issue right now is just too many instances in the Workspace. To my knowledge, you could reduce server load by using InsertService, but that can fail and has its own set of risks/issues…

Can you share some of your Performance stats? (It’s in the ingame Roblox settings)

1 Like

image

The amount of parts and instances is pretty much required because of the trees and road detailing, not much more optimizing I can do

Map is only maybe 2-5% complete if that, right now its impossible to have a realistic map including a central business district and long driving roads similar to forza horizon with a rough side of 60k studs north south and 40k studs east west

I run this game very comfortably at 7 graphics or lower, where I would still be lagging somewhat in other driving games: Greenville, Driving Empire, Midnight Chasers for example, so its not really a direct optimization issue from the assets

Without being able to move props and vegitation and other assets out of workspace it becomes a memory hog, already have some unions not loading in

oof. Part count aside, having 61,000 instances is bound to cause performance issues.

For one: don’t use unions. Meshparts are generally way better for optimization as unions, especially with curves, are somewhat expensive.

When using Meshparts OR Unions, however, make sure to change the CollisionFidelity to best suit your needs. If it’s CanCollide is false, set CollisionFidelity to Box. If you need a rough shape, set it to Hull. Try to avoid Default & Precise–those should mainly be used when more accurate collisions are needed.

example of correct 'Precise' collision usage

If you need accurate collisions, make a simpler version of that object’s hitbox, then make it invisible and use that as the collision. I used this method for buildings in my game, reducing the buildings from 200+ parts each to 2-3 Meshes.



What are you currently using Unions for? How many parts are used in your roads to where they would need lots of detail?

I typically avoid unions and keep everything to box and no collide when possible. I use unions for terrain between the grass wedge on the side of some roads


roads themselves I try to keep optimized while having detail, asphalt is one part, rumble strips are one part with a texture, road lines are one part each, with the dotted road lines using a texture, and the one meshpart each side for jersey barriers, which have a box collision and preformance enabled


buildings are pretty optimized aswell

its just the amount of props and trees that I use to populate the map, which are pretty much required to have to look realistic that suck up all the parts and instances, which is why I need a system like this

1 Like

Wow. Can the Roblox servers even hold that much terrain?

just part terrain lol, not crazy like roblox terrain

I’m sure you could design this yourself by creating a wrapper that converts instances into data (serialization module), save the data by ‘chunks’ inside modules with the center of the chunk being the pivot or whatever then load chunks based off of your own terms. Obviously this would need a lot of optimizations, i.e greedy systems, culling where possible, loading in the background, soft unloading, but I wouldn’t bank on Roblox adding this feature in the near future even though I agree that it is extremely needed.

Keep in mind you can also try splitting your map into large parts divided by road, similar to GTA and on Roblox, UD Westover. This can help reduce load on the client machine, but at the end of the day you will need a system similar to what I wrote, or what you want from Roblox.

1 Like

In my opinion (from my own researches), you can use gen-“AI” to re-render things like roads or even nature or buildings (that’s just simple 1 block and texture in and visual mesh), and store road-points and buildings as just waypoints and have them construct/removed as player is driving nearby to those waypoints, this way you can store in main objects or the main plain map which has barely any instances in it.

Such rapid streaming can sound ridiculous, but if you use basic block + mesh + decal to mimic the building, it’s rather low memory usage and low performance hinder. Then only when player is super close to the said building, it should be the real building-mesh to pop into existence for player in client side for the superb details.

^ I am unsure what you meant here, ServerStorage doesn’t carry anything into Client sides or renders. Unless you meant Server to stream in specific objects to players as player approach them?

100k studs is also Roblox game so call “current maximum” (although Roblox game map can reach real life galaxy in 1:1 scale), if you scale-up or soup-up Gen"AI" more, you can just have a driving game; on a map that span across entire Earth kinda like what I have made in my own project.

Roblox has vast potentials but they’re more focus on cramping “AI” to have brainrot games generate AI contents and AI codes by itself rather than developing Roblox’s own unique potential no other platforms have, but it’s Roblox :hyacinth: .

1 Like