Quick answer: Canvas Scaler → UI Scale Mode = Scale With Screen Size. Reference Resolution to your sprite authoring res (often 1920×1080). Match = 0.5 for balanced. Disable Pixel Perfect on variable-DPI targets. Ship sprites at 2× or 3× native to keep them sharp on retina.

Game looks fine on a 1080p monitor. Open it on a 4K screen, every UI element is fuzzy. Or it’s sharp on PC and blurry on iPhone. Canvas Scaler config and source sprite resolution interact, and getting both right takes a minute.

The Symptom

UI text and icons look blurry on high-DPI displays. Game scales correctly to fill the screen, but everything is upscaled with bilinear filtering. Worse on iOS retina or Windows 200% scaling.

What Causes This

Two layered issues:

  1. Canvas Scaler set to Constant Pixel Size. A 1920×1080 layout literally renders at 1920×1080 pixels regardless of screen DPI. On a 4K display Unity scales the framebuffer up; sprites blur.
  2. Source sprite resolution. A sprite authored at 64×64 looks fine on a 1080p display where it occupies 64 actual pixels, but on a 4K display the same UI slot is 256 actual pixels and Unity bilinearly stretches your 64-pixel asset to fill it.

The Fix

Step 1: Switch to Scale With Screen Size.

Canvas Scaler:
  UI Scale Mode:        Scale With Screen Size
  Reference Resolution: 1920 x 1080
  Screen Match Mode:    Match Width Or Height
  Match:                0.5

The canvas now scales such that one reference pixel = N screen pixels at higher resolutions. Layout positions stay correct; rendering uses the actual screen pixel count.

Step 2: Author sprites at the highest target resolution. If your reference is 1920×1080 but your largest target is 4K, ship sprites at 2× (effectively 3840×2160 design). The Sprite Importer’s Pixels Per Unit and Texture Max Size settings let you carry the full resolution and let Unity downsample on lower-DPI displays.

Step 3: Disable Pixel Perfect on variable-DPI canvases. Canvas → Pixel Perfect checkbox. Off for any UI that scrolls or animates; on only when you’re committed to a pixel-art style on a fixed display.

TextMeshPro and DPI

TMP renders text from a Signed Distance Field atlas. The text stays sharp at any size if the SDF font asset has high enough atlas resolution (4096 atlas with 90 sample padding is the standard). If TMP text is blurry but Image components are sharp, regenerate the font atlas with higher Atlas Resolution.

Match Slider

Match Width Or Height → Match = 0…1. 0 means scale strictly by width (good for portrait UIs that need to fit horizontally). 1 means scale by height (good for landscape). 0.5 balances. Pick based on which dimension the UI most depends on remaining visible.

Verifying on Each Target

Build and check on at least three resolutions: 1920×1080, 2560×1440, 3840×2160. Take screenshots and pixel-count a UI element. If your sprite is 200 pixels wide on 1080p and renders 400 pixels on 4K from a 200-pixel source, it’s being upscaled — ship a 400-px source.

“Scale With Screen Size. Authoring res = highest target. Pixel Perfect off. Sharp on every display.”

Related Issues

For TMP text blur, see TMP rendering. For Canvas anchor issues on resize, see UI anchor.

Scale With Screen Size. Hi-res sprites. Pixel Perfect off. Crisp.