More control over Streaming Enabled

Streaming Enabled is currently the mysterious property of the Workspace that developers on the spectrum from beginner to top are left to figure out how it works. Streaming would be amazing to enable on games such as Apocalypse Rising and Prison Royale.

Sadly, those games do not enable it due to multiple factors. Some of which being that the ROBLOX Wiki does not educate the developer on what Streaming actually does in terms of the render distance or that it isn’t modifiable to user’s preferences. ROBLOX has a philosophy (Mentioned @ RDC) that the platform should just work without the user having to make customizations. But when ROBLOX becomes a host for your own imagination different games will require different custom changes so your vision is sought out properly. Here are a few API/Property additions I feel should be added:

Workspace:StreamIn(Region3 Region)

Loads in this Region3 chunk and will not unload it unless specified by code otherwise using Workspace:StreamOut()

Workspace:StreamOut(Region3 Region)

Unloads Region3 chunk unless it conflicts with RenderDistance

Workspace.StreamingEnabled (Read-Only \ Editable only in Studio)

  • Enum.StreamingEnabledType.NotEnabled (Self Explanatory)
  • Enum.StreamingEnabledType.Default (Roblox’s Current Streaming System)
  • Enum.StreamingEnabledType.Custom will always render to Workspace.RenderDistance
  • Enum.StreamingEnabledType.DefaultWithMinRenderDistance Acts like StreamingEnabledType.Custom but will load more chunks if the computer can handle it

Workspace.RenderDistance ((MAYBE) Read-Only \ Editable only in Studio)

An Int representing how far (in studs) rendering/stream-in will go before it won’t load any more information.

Benefits of these API additions

  • Allows for users to control how stuff loads into their own game instead of spending tons of time creating their own “hacky” LoD system so they can have control of what the users see.

  • Allows for the ability in [combat] games to make it so where if player1 has a graphics quality of 10 sees player2 who has a graphics quality of 1 causes player2 not to see player1. These APIs will give developers the the ability to load chunks where player1 is for player2 if needed. Or if StreamingEnabledType.Custom is enabled they’ll either both see each other or won’t see each other (unless workspace:StreamIn() was used in that chunk) .

  • A user is planning on moving a player to a different place in the world, he can preload the chunks before teleporting the player or else currently the player will fall through the map.

  • Another example is if a user equips a tool that allows for zooming into further places the user can load chunks in further places such as binoculars or sniper scopes.

77 Likes

I definitely think that these additions would be amazing and quite useful for every game developer!

Right now using network streaming is quite hard to use due do to the lack of control, and for this reason, it is not utilized by most developers. However, with more control, more developers would probably use network streaming which could be beneficial for performance across all platforms, especially mobile.

3 Likes

Additional Proposal

Workspace:AddToStream()

Similar to Mouse.TargetFilter, except this will exclude every other thing in the workspace and only unload the objects that are passed in the function, simply a whitelist. It’s always been an issue that when streaming is enabled, we have to add waits to our code because some parts of the map haven’t loaded in, this should solve that because we can decide which parts of the map we can keep and which ones not to keep.

local Buildings = Workspace.Buildings --A folder/model under workspace
Workspace:AddToStream(Buildings)

Let’s say we have no code that has a reference to the buildings and these buildings have a good amount of detail, we’ll now be able to unload these buildings when needed, keep our code working and maintain a good level of detail in our builds.

9 Likes