Skip to content

Quality Levels

A project can ship one picture and run it on a flagship phone and on a six-year-old one. Quality levels are how: three profiles — Low, Medium, High — each saying what the renderer spends at that level. The project picks one (or lets the device pick), and a game that is too slow for its level steps its resolution down on its own.

Settings → Project → Rendering → Device Quality → Quality level:

Mode Meaning
Off No quality management. The project renders as authored. (The default.)
Low / Medium / High That level, on every device.
Auto The level comes from the device: the first device rule that matches, otherwise memory and core count.

Dynamic resolution lowers the scene’s resolution under GPU pressure, down to the level’s Min render scale, and brings it back when there is room; the UI stays at display resolution. A scene drawn below the screen’s size is stretched back with a Catmull-Rom resampler clamped to the texels around it, which keeps an edge steeper than a bilinear copy does without drawing a halo; a whole-number stretch is an exact copy instead. Target frame rate is the frame time it works to.

Quality Levels → Editing level picks which level the rows below show and change. They are grouped by what they spend:

Group Settings
Rendering Render scale, Min render scale, MSAA
Shadows Atlas size, Cell size, Cascades, Distance
Reflections and particles Planar reflection scale, max size and updates per second, Particle limit
Post-processing A master switch, and a tick for each effect that runs at this level

Each level starts from the engine’s own values for it, and only what you change is saved in project.esproject under features.rendering.quality.profiles.<level>. A default the engine improves later reaches a project that never touched it, and a row set back to its level’s default is not a difference.

Every post-process effect the engine has is in the list, ticked where the level runs it. An unticked effect is skipped at that level wherever a camera’s volume asks for it — and all of it: an effect with several passes, such as Ambient Occlusion or Auto Exposure, is removed whole. The manifest holds the effects left out by type:

"quality": { "mode": "auto", "profiles": { "low": { "skipEffects": ["ssr", "taa", "depthOfField"] } } }

By default Low leaves out reflections, temporal anti-aliasing, depth of field and light shafts; Medium leaves out reflections and depth of field; High leaves out nothing. These defaults follow the work each effect does per pixel; they are not measured on weak devices. The editor’s fx-cost check measures each effect’s cost on the machine it runs on, which is a way to find out what yours costs before choosing what a level skips.

Shown when the mode is Auto. Each row names a level and the conditions a device must meet: Model contains, GPU contains, Max RAM and Max cores, all of which must hold. The first row that matches decides the level. A row with no condition would match every device, so it must have one.

The same settings are QualityConfig — QualityController, parseQualityConfig, resolveQualityProfile and defaultQualityProfile build and read them — and the running level is the Quality resource.