Canvas responsiveness & performance

The paint canvas renders on a dedicated GPU worker thread, separate from the user interface. In practice this means the app never freezes while you paint: long unbroken strokes, giant brushes, flood fills over a whole viewport and bloom post-processing all render in the background while panning, zooming and the tool panels stay fluid.

This guide explains the behaviours you may notice, and the few knobs that exist.

What the worker canvas gives you

  • No mid-stroke freezes. Stroke input is never dropped or coalesced away — every movement of the pen lands on canvas — while heavy rendering catches up asynchronously. If the renderer briefly falls behind (for example a flood fill across the whole view), the canvas keeps showing the last completed frame instead of stalling the app.
  • Crash-proof painting. Every completed operation is written to an on-disk journal the moment it settles. If the app crashes or the GPU driver faults, the next launch replays the journal and your painting comes back — including its undo history, which works across sessions. The journal lives under the app data directory (…/paint/documents/<document>/journal).
  • Driver-fault recovery. If the GPU device is lost mid-session (driver reset, GPU hang), the worker rebuilds itself and replays the journal onto the fresh device. You may see the canvas repaint once; nothing is lost. See the rendering troubleshooting guide for the wider fault-tolerance behaviour and the --rhi-validate diagnostic flag.

Backend selection and fallback

The worker prefers Vulkan and falls back to OpenGL (ES) where Vulkan is unavailable. On backends that cannot run the spectral engine at all (very old or reduced-feature GPUs), the app transparently swaps in the legacy single-threaded canvas: everything still works, but heavy operations will briefly pause the interface — the pre-worker behaviour.

The worker canvas is the Accelerated canvas engine setting in the Diagnostics category of the paint settings. It is an advanced setting, so check Show advanced to see it, and it applies the next time Paint opens. Its key is paint/rhi/workerCanvas (no environment variables — OctoMY runs on devices where those aren't available). The Canvas engine row of the Status category says which engine runs now, and why when Paint fell back.

Behaviours worth knowing

  • First stroke of a session. The very first pen-up after launching can hiccup for a fraction of a second while the GPU driver finishes its one-time setup. Every stroke after that commits in milliseconds.
  • Bloom pauses while you draw. With bloom enabled, the glow is suspended during a stroke so you see crisp, low-latency paint; it snaps back the moment you lift the pen. This is Skip bloom while drawing in the Bloom category of the paint settings — turn it off if you prefer live glow at some latency cost.
  • Checkpoints at idle. A moment after you stop interacting, the engine snapshots the canvas so crash recovery and undo never have to replay your whole session from the first stroke. This happens in the background on the worker; you won't notice it.

Behaviour under memory pressure

The worker keeps large canvases within the GPU's memory budget on its own, so you can keep painting past the point where the whole canvas would fit in video memory:

  • Chunk eviction (automatic, always on). The canvas is stored as tiles ("chunks"). Only the tiles you are looking at, up to a budget derived from your GPU's memory, are kept resident; tiles that scroll off-view and are already safely checkpointed are dropped and streamed back the moment they come back into view. You may see a large canvas fill in tile-by-tile as you pan — that is the reload, not a stall. To override the automatic figure, set Resident chunk limit in the Engine category of the paint settings.
  • Adaptive render-scale (opt-in). Under sustained render pressure the worker can temporarily render at a reduced internal resolution and upscale to the widget, trading a little sharpness for a steady frame rate; it returns to full resolution as soon as the pressure clears. It is off by default — turn on Adaptive render scale in the Engine category of the paint settings. Spectral fidelity is never reduced: all colour bands stay at full precision regardless of pressure, so adaptation only ever touches spatial resolution, never colour.

If a genuine fault (rather than mere pressure) forces a feature off, the app raises a degraded-feature notification — see the rendering troubleshooting guide for what those look like.

See also

In this section