Add Stable Local Assets for Common Use/Cloud Fallback

It is currently too difficult to work with simple universal assets such as pure back/white textures, simple shape images, placeholder sounds, and primitive meshes without jumping through a few hurdles. Having a universal set of localized assets would improve ergonomics, consistency, performance and robustness for these cases.

The Problem

Currently, almost all of the assets we can use have to be cloud assets. This is obviously necessary for unique game-specific assets but is unideal for more simpler assets such as the ones I have mentioned above. This is because cloud assets come with their own disadvantages:

  1. They require some work to add, as we either have to upload them ourselves or use someone else’s (which is not recommended, as future permission changes could break them).

  2. Every client must download and stream in these assets on demand. This adds latency and increases load times, especially for games that try to preload everything before the client can play.

  3. Cloud assets are prone to fail, either due to them getting moderated or archived by accident, or due to server/network failures.

  4. In general, it seems pretty silly to upload a unique blank image or cone mesh every time you need one. These are very common assets that shouldn’t even need to be served from the cloud to begin with.

To avoid these issues, some developers use local legacy assets and (up until now) local internal assets meant for studio, either as actual game assets or as fallbacks for when a cloud asset fails.

However, this approach also comes with its own downsides:

  1. These assets aren’t really intended for developer use, so there aren’t that many useful ones besides a few arrow images and legacy meshes.

  2. There’s no guarantee that these assets will stay the same or won’t get deleted in a later update.

  3. These assets are stored directly on the client’s disk, so it’s possible a client could accidently alter/corrupt/delete these assets. Some asset paths are internally remapped to avoid this, but there’s no definitive list for which ones do.

Due to these reasons, this isn’t a very useful or future-proof option for using localized assets. We need a first-class supported way.

The Proposal

Add a set of local assets that developers can use, ideally through a separate URI scheme such as rbxlocal://white.png to avoid confusion with legacy/internal assets.

These would help developers avoid issues like client load times and cloud failures, as well as canonizing certain universal assets for convenience.

The types of assets that would be included are up for debate, but a few suggestions would be:

  1. Solid color textures, such as pure white/black/transparent.
  2. Basic shape images, such as circles, triangles, arrows, etc.
  3. Miscellaneous textures, such as grids and gradients.
  4. Primitive shape meshes, such as the built-in part shapes, as well as non-supported ones like cones, capsules and rings.
  5. Simple R6/R15 character meshes.
  6. Simple sounds, such as the character sounds and maybe even placeholder music.
  7. Different versions of these assets, like different sizes, resolutions, colors or shading. Some images could even be grouped in sprite-sheets to save space.

If the issue for stable local assets were addressed, we would be able to use more performant and robust assets that aren’t prone to break.

12 Likes