Pre-Downloadable Game Data for Better Performance

Hi all!

I had an idea that could really help improve the gaming experience for a lot of Roblox players, especially those with lower-end devices. The basic idea is to allow users to download game data—like maps, models, and other assets—onto their device in advance. This would be a one-time download every time an update rolls out. That way, the device already has all the heavy data it needs, and it only needs to handle temporary things like player locations and unanchored items during gameplay.

This could make it easier for players to enjoy high-quality maps and designs, even if their devices struggle to render high graphics on the fly. Here’s how I think it could work: Roblox could add an option on an experience’s page that lets users pre-download the game data. This way, players could download their favorite or most-played games directly to their devices.

There are some obvious benefits here:

  • Better Performance: Games would run smoother on lower-end devices since they wouldn’t have to constantly stream data.
  • Faster Loading Times: With the data already on the device, games would load much faster.
  • Reduced Server Load: Less data being streamed could reduce strain on Roblox’s servers.

Of course, there are some potential challenges, like the risk of game data being stolen or compromised since it’s stored on the client. But with the right security measures—like encryption and regular integrity checks—I think these risks could be minimized.

Overall, I think this feature could really improve the experience for a lot of players. Thanks for reading!

P.s to any roblox staff reading, please consider!

P.p.s im really curious to hear any suggestions because I believe with the correct input and done correctly it can really be a powerful feature

22 Likes

This wouldn’t work for assets that are created via scripts

But that’s a problem: one of Roblox’s big appealments is the fact that you don’t need to download anything; you just click Play and join the game. If you had to re-download the game for every update of every game you like, that would just be tedious for the user (it will also require them to have sufficient storage on their device)

I know this is optional, but a low-end user likely would stop playing anyway since their device is too weak. Users with slower internet will still struggle with that as well

That’s really only part of why low-end devices perform badly. You have to take into consideration that some users are still running setups built in 2009 (whether it be for personal or economic reasons). Pre-downloading the game will prevent them from needing to stream it, but the technology the client is using will continue to run poorly

(Also, I don’t think streaming the game’s content takes too much performance, but I have to look into that)

Encryption and integrity checks are not enough to stop content from being stolen. Regardless, game data can still be stolen whether or not it’s being streamed


I don’t know how viable this request is. This would largely only help with internet and bandwidth for low-end players (assuming they don’t have a good connection). However, they will still need to deal with latency between the client and server

15 Likes
my personal take

In short this isnt even a real issue, if you dont enjoy assets popping in even after a player gets past the roblox loading screen, just make your own and use ContentProvider:PreloadAsync() with a list of assets you’d like to be loaded asap.

This has a very obvious and unavoidable downside, roblox is a game platform made for people to bounce around from game to game efforlessly with as little load time as possible. The amount of assets you’d have pre-downloaded from every game you join adds up pretty quickly especially on lower end devices with small storage space. Not to mention roblox in general is a fan of doing things during run-time (when the game actually runs) vs build-time (the development stage)

just go read omega’s post he explains what im thinking better

6 Likes

Once a client receives even a streamed asset, it’s at the same risk as one pre-downloaded one.

1 Like

it will be really good if they added that but there should be more things for safety

  • the player get a prompt asking to save data and saying how much storage it needs
  • the ability to remove/view games dawnloaded data from roblox
2 Likes

An auto redownload option would do the fix, automatic 3am updates.

Correct, i worded it poorly, its targeted towards low bandwidth users rather than weak device users although can be beneficial for both

Again, very well written yes but i think once the data is more localized it can be easier but i dont have concrete proof

Agreed, but having this option can shift, or better yet expand the market. It would all be optional features, roblox would be exactly the same, just an extra button in a menu.

Yes it would turn roblox into less of a hop on hop off platform but would assist a decent enough player base for it to be worth it for roblox

Of course, the data will save like the way any data is saved on any experience on roblox.

Great point

3 Likes

Again its really targeted for when a user logs in and is waiting for the game to render in, or a player is traveling a lot of studs very quickly and the game cant render as fast as the players speed, or the player is looking into a distance and can see more than a few studs away from it instead of the usual current lowest graphic mode = seeing not more than 20 studs away

1 Like

people will be able to copy games that way, lets just keep it in ram where you atleast have an anti tamper “guarding the door”

1 Like

I think basic, Roblox-provided Materials should be auto-installed to the system.

This has been suggested before, and I’d honestly really like something like this. I don’t have the best internet and there are times where I have to wait several minutes just for RequestQueueSize (check SHIFT+F3) to get to 0 in games I visit every week.

Obviously this should be completely optional per-game, but I’m also unsure as to how this could be safely implemented. It should not be a permanent download.

Games don’t always use the same assets as they once did. Devs can replace assets or remove entire maps, leading you to keep tons of assets that aren’t even being used anymore. If you were to permanently download a game that receives regular updates, the file size for that game on your device would just keep increasing forever. And how do you distinguish between game assets explicitly added by the developer, and arbitrary assets like avatar clothing and user thumbnails?

Maybe a solution could just be to let the cached data last longer. Roblox automatically clears cached assets every day to free up space, but you could choose to override this per-game. The next time you visit the place, if a previously-cached asset wasn’t loaded during that session, automatically delete it to free up space. (Or something similar to that.) And also display exactly how much storage a preloaded game currently takes up on your device, with the option to delete all of its data whenever you want.

3 Likes

Something like this could and probably would be automatically done behind the scenes. It would make sense for it to happen, for example, with your recent top 3 most played games.

1 Like

If I’m not mistaken, Roblox already caches some files from an experience when the Player joins it, making subsequent joins quicker. However, I think these files are cleared when other games are played for longer. Having separate caches for certain games would be cool, and it’d be totally optional for the Player if they want to use the feature. The default setting could just stick to letting Roblox decide what’s best for the Experience setting.

I don’t really see any issue with this considering assets that don’t change wouldn’t need to be re-download and shader compiled.

Also, games like Fortnite already use caching to cut down on load times. I think it’s usually standard practice to do this sort of thing. In Roblox’s case however, they’d have to stick to just caching mesh assets, animations, and possibly the textures too. Part data is usually the quickest to replicate and is often shown as grey until said assets are loaded. It’d be super beneficial to have something like this especially when Roblox is upping the texture size cap to resolutions higher than 1k

2 Likes

If you are wondering, I believe the cache is simply limited in size (for example, it is limited to 1GB on desktop platforms); exceeding this limit will simply have previously cached files kicked out from the cache. This means that joining a game with a lot of assets will result in other games getting kicked out from the cache, although visiting a small game with minimal assets may not result in any cache deletions. Afaik the cache is (mostly) handled through files in the %TMP% folder so increasing the limit could lead to users having low file storage space; there’d need to be a way to clear this cache and / or set a hard-cap if this were to happen.

2 Likes

The HTTP Cache already exists and I’m pretty sure it saves everything from your last join (up to a point).

I like the concept of bundling assets into a launchable archive format that the launcher can open, not sure what you’d do about stealing assets though. (scripts and the place itself isn’t ever cached so these are fine)

I think it stands true what others have said above

here

and here

So I wouldn’t think of it as problem, although im not knowledgeable enough to make an informed decision

An exploiter once loaded into a game, has access to every piece of code ran client side as well as every instance replicated to them, which they can very easily extract from a running client and save to a file.

(cc. @Sushiriceforlife)

I was talking about assets that would be stored in the archive itself (images, sounds, meshes [afaik these are the only assets that cache). Also, to my knowledge, Roblox’s cache format hasn’t been reverse engineered yet. I’m very well aware scripts (well in bytecode form anyway) can be extracted from the memory.

Well, I just happened on this topic and I see there’s some really good ideas here. I have no idea if Roblox caches assets or not. Based on my experience, it doesn’t. I’m on a PC and a game that I play frequently must download assets from the server each and every time.

Using a MRU (Most Recently Used) cache with a side limit based on device type (configurable in user settings) would work quite well for games that are played often. The method that I used to make one when writing a sector cache for a file system was a linked list coupled with a chained hash table. The linked list kept the order of items and the hash table was for fast lookups. This operated completely in memory. When a sector that was in the cache was requested, it would find the address of the linked list node in the hash table, then it would move that node to the head of the list before copying the data and returning it. If something isn’t used for some time, it will be further down on the list and subject to being purged when new items are cached.

Since we are dealing with caching of assets saved to mass storage, one could do what Google Chrome (and other Chromium based web browsers) does: Use a lightweight SQL database to store the file indices and save the files to disk (Google just renames the files). In fact, there is a package in FOSS for SQLite. That’s an actual package for this.

The files can be encrypted with a suitable cipher. There are legal issues involved with crypto though. In the United States, cryptography software is classified as munitions, so there are export controls. Furthermore, some countries have banned cryptography all together or place heavy restrictions on its use. These are legal issues that Roblox will have to resolve. One way to deal with this is to bundle an appropriate cipher into the client upon download based on what the IP address and client’s country is. This can be done on the fly. Countries which have banned crypto or have Class D:1 or E:1 status can be excluded from having crypto, or use a state approved cipher for that country.

It storage space is an issue, the files can also be compressed. Image data is already compressed, so you won’t get much savings from that. Sound files like .mp3 and .ogg are already heavily compressed, so no savings there either. Meshes are probably the only one that can be compressed. Other assets such as Workspace instances can probably also be saved and compressed.

Overall, this is an interesting idea. It would definitely save loading times as well as network bandwidth since internet is not unlimited in many parts of the world.

1 Like

As others have said, Roblox already has a cache for assets, and it makes a big difference for people like me. In Guts & Blackpowder, having nothing in my cache (%Temp%/Roblox/http) caused it to take 4 minutes to load, whereas on the second attempt, it only took 1 minute and 15 seconds. There are also open-source scripts online to extra assets from your cache if you want to verify that it does, truly, exist and function. After my testing, the cache had grown to ~500MB.

I think for fast connections however, it doesn’t really make difference. This is speculation, but I think, before using the cached version of an asset, it sends a request to Roblox’s APIs to make sure it has the right version, which can cause assets to pop-in or be grey as though they aren’t cached at all.

1 Like

NVIDIA’s control panel already has an option to set a Shader Cache Size limit, so it’d be neat if Roblox had a settings option under some sort of Advanced section for those who want to configure something like that. For Mobile players, I don’t really think a Cache like this would be feasible, but for those with computers that have storage but not great shader building power could benefit from this greatly.