It might be convenient for the users to have a universal graphics quality slider to remove complexity in adjusting the graphics fidelity, but on the side of developers, it is abysmally difficult to work with.
Here are some core issues I’d like to present
Issue 1: There’s no way to know it’s current state.
The user settings option for getting the current Quality Level might return automatic if that’s what it’s currently set to.
This means that the returned value is effectively useless, as if they set their quality to automatic, we’ll never know what the state it’s in.
So any attempt at working around its limitations are already impossible.
Issue 2: No way to set/get the cameras far plane.
While automatically resizing the frustums far plane to reduce rendering is nice in theory, this can easily break intent from certain games super easily. Especially when a lot of mobile players often have to go to the lowest graphics quality to play the game.
This is problematic if your game design requires you to see landmarks far away, players far away, billboards far away, camera is far from the scene, etc…
LODs that are also supposed to exist for lower end devices don’t even get used properly because they get culled off from the short render distance.
Games where the camera is following the player very far away (usually with a small FOV at graphics level 1) often completely break on lower graphics settings as the far plane doesn’t reach the required objects it needs to rendered.
Games that also rely on seeing players at far distances (e.g. using bows or sniper rifles) suffer from this issue greatly, as players on lower graphics level may not even see the player that is attacking them, which can lead to unfair advantages.
Issue 3: Lights also getting culled dynamically based on distance based on the current Graphics Level. This can easily ruin artistic intent.
Issue 4: Beam Segments change on graphics level
At max level a beam will look as intended, but every level down, it will reduce the amount of segments by some hard-coded formula.
This is really bad, as any curvature created with beams is effectively useless as it will no longer maintain it’s original shape.
So unless you have beams with only 1 segment, devs have to often just abandon beams altogether or risk users with lower devices seeing incorrect shapes.
(Or Alternatively, make a beam with an absurdly large amount of segments solely for players with graphics quality 1)
This has been a long standing issue:
Issue 5: Rate of Particle Emitters are globally affected:
Often the rate of Particles is hand-picked by devs on purpose to achieve certain visual styles.
To have the graphics slider globally reduce the rate for all emitters can easily ruin artistic intent.
Since there’s no way to communicate tag/important to these emitters, there’s no way to stop the engine from doing this without manually emitting particles yourself.
Additionally, the reduction doesn’t even guarantee a gain in performance, it’s indiscriminate to the state of the scene. This means even if your game has only 1 particle emitter, it will still get affected the same way.
Issue 6: Rendering logic is changed on lower graphics settings.
There are some known rendering changes based on the graphics quality setting.
Most famously glass will obscure water at higher graphics level, but will not at lower graphics level
Terrain Water will become opaque at a lower graphics level:
Ultimately, bundling up many graphics setting together is very difficult to work with, and can easily fight against developer intent. Ideally we’d have more control over the nuances on both the client and developer side, because it’s simply impossible to cover all intents in 1 graphics slider and it requires every developer to make excruciating compromises at times just so players at the Graphics Level 1 can even play the game.
Additional posts talking about this issue: