Low quality vs High quality toggle?

Ok, so I’ve been playing a few simulators here and there and often they have this UI that the user can toggle for high & low quality. Games like bubblegum simulator for example have this quality system, but what I’m wondering is how is this possible and how does it work? How does it actually change the quality of the game so that it’s suitable for low end devices and ect?

On a side note, how is it able to identify what quality is recommended for me?

4 Likes

I think you should try somethings:

  • Making a chunk loading system (changing the loading distance according to device)
  • Removing textures, decals for low detail.
4 Likes

I made a post a while back with a few ideas to use in a quality toggle option.

The methods in the post are just a few basic ways you can lower the workload for a client.

In terms of the recommend quality, I would assume it just tries to check if a user is on a mobile device, and recommends lower quality if they are on one, but I am not completely sure how it calculates this. You would have to experiment. You could also possibly count the frames per second a user is getting to determine the speed of their device.

2 Likes

It is probably all done on the client, where local code removes effects or allows effects according to the quality level. They just optimize or remove things that could improve client performance basically in lower quality mode or they add higher graphical effects with higher quality mode.

GetPhysicsFPS is a possible way to detect framerate and recommend quality of the game based on that. It might be that they run the low quality mode and if the FPS is good, they recommend high detail option or the reverse could be true (if high quality mode lags, recommend lower quality mode).

2 Likes

@varjoy @ExcessEnergy @ArtFoundation, thankyou all for your answers. As for the actual change in quality, I would assume you could something like looping through all decals and textures in workspace, or a selected amount and destroying them? As far as I know, that isn’t really a way to actually hide them, or reduce them without the use of a chunk system, and if it was wouldn’t it be noticeable. I’m thinking of doing what @varjoy mentioned by using a chunk system to get the textures in replicatedstorage and set their id’s if the player is close to them, is that effective?

1 Like

This is quite a good idea if you aren’t willing to remove non primary textures all together for lower end devices. As well as textures, you could also load/unload the ParticleEmitters, complex models, and objects being acted on by physics( as they take up a good amount of processing power to calculate ).

1 Like

Thank you for your input. I understand a lot better now :slight_smile:

2 Likes

I’ve been working on this on and off and so if anyone who would like to see how I went about this, in future here is a small clip of somewhat progression of the toggling system. I haven’t gotten to do the chunk system yet, but hopefully will do later and update this thread with the relevant code and outcome. Most of the code is done on the client, and the server plays a small role for simply loading the character.

I was actually thinking of using Streaming Enabled for the chunk system but I’ve heard it’s unreliable and often buggy. I’m not sure if you can even change it throughout script.

I used an over exaggeration to show the effect. Is nothing out of the ordinary. Also the fps checker is very inconsistent. Atleast my fps is :man_shrugging:t2:

https://gyazo.com/f8cac4d4e56f45a8408c9df75555ac53
https://gyazo.com/cdc95d3be04d8e2652f5f8550c1f2263
https://gyazo.com/4393539f68039d84f39567870f31f78b
https://gyazo.com/316bf087b210d486c826102b2b39e063

1 Like

I looked into this, and just saying GetRealPhysicsFPS gets the client physics fps, rather then client’s rendering fps. Physics fps is completely different to the client’s fps, and not accurate.

You can use the Heartbeat event to create a method for detecting framerates in rendering.

Yeah, that is what I’m doing right now, however I’m using RenderStepped, and doing 1/step to get the FPS.