Streaming needs to consider render performance

As a developer trying to make a large game I have never felt that streaming has done a good enough job at enabling me to create large games. While the tech surrounding the feature has come a long way and given us more options to customize streaming it still feels like it solves only solves half the performance problem.

Streaming solves the memory issue, it doesn’t solve the render performance issue.


I work on a game with large map and early on we made the decision to use a custom chunking system over streaming. As the years have gone by and our map continued to expand our chunking system enabled to to have consistent performance at the cost of awful memory usage. This chunking system enabled us to have a map totaling:

  • 34000 map element models
  • a 14000 by 14000 stud footprint
  • many unique detailed locations
  • 524000 parts, 753000 instances

Recently we’ve been experimenting with streaming and have run into a wall pretty quick. We’ve been able to set up all our map element models to be streaming LoD ones, and we’ve grouped our terrain into ~150 by ~150 stud sized models that also use the streaming model LoD system.


* Our map set up with streaming model Lod system.

Our initial findings were great! the game ran really well when you spawned in and memory usage was far less than with our custom chunking system. The render performance problems start to occur once you travel around the map and the LoD models start to turn back into the full detail model. These models wont turn back into the LoD models until some unknown memory threshold is hit.

Streaming appears to have no regard for the users render performance. The way streaming lets geometry linger around after it has exited your streaming radius seems to have a direct link to poor render performance as more LoD geometry is replaced with full detail geometry.


* The image above shows the path my character took around the map. You can discern where the full detail models are along the path and the LoD models that are to the sides of it. This demo has small max streaming radius and no fog/atmosphere to better illustrate undesired behavior.

Our game is set up to have a max streaming radius of 1200 studs and fog that occludes everything past 1000 studs which means after a while most of the full detail models loaded in aren’t even visible. After you spend 20 minutes exploring the map you’ve probably loaded in a good amount of detail models that aren’t going anywhere until your devices memory starts to get high. This means every time you look back at the places you’ve been your render performance tanks.

Our map has a central “highway” system with bridges that lets you travel between the 3 main islands. We call this “the loop” and used it as a benchmark for performance. Our findings after running around the loop were generally:

  • On spawning in: 60+ FPS (some testers running FPS unlockers ran into the hundreds)
  • While running around the loop not looking back at where you traveled solid: 60-120 FPS
  • After completing the loop and looking back at “the entire map” / were you traveled: 30-60 FPS

* Testing was done in a gameplay functioning environment so we could get a decent idea of real world performance. Testing in no-gameplay environments gave us the same results.

* Changing the escape menu quality setting from manual to automatic didn’t have a noticeable impact on the results.

* Testing devices used had low-mid to high performance hardware computers. Mobile and console testing was not done since our game does not currently support either platform

* Some testers reported seeing memory used drop part way through their trip around the loop, the implication being that some models did revert to their low detail LoD Mesh. These testers still reported a large hit to render performance at the end of the test


As a developer I feel like the current “path” behavior streaming uses is a waste of resources and it limits the potential for streaming. I would much prefer out of range geometry to be removed or if it’s enabled, turned back into low detail LoD models. The path behavior gives me no control over potential render performance issues and I feel like I am left at the mercy of “the streaming checkbox” to hopefully keep my game playable.

If Roblox were to implement some form of a “strict radius” mode that forced geometry out of the streaming max range to unload or revert to low detail LoD models it would enable me to use streaming in my game and remove an egregious amount of tech debt that was required to make a game this big in the first place. I wouldn’t feel like there are big trade offs to using streaming if I could guarantee a consistent experience for my players over longer play sessions.

I can provide a demo place file to any Roblox staff members wishing to get hands on experience with our map and streaming set up. I cannot publicly offer the place file.

41 Likes

This is a feature that is currently under active consideration/proposal. Thanks for this detailed feature request.

26 Likes