Table of Contents

DPI и масштабирование

Интерфейс, свёрстанный в пикселях, крошечный на 4K-экране ноутбука и огромный на маленьком. IcyUI выполняет компоновку в единицах интерфейса, а Canvas при отрисовке умножает их на коэффициент масштаба, чтобы интерфейс сохранял разумный физический размер. Коэффициент берётся от дисплея, от разрешения, под которое вы рисуете, или от обоих, и умножается на настройку, которую может менять игрок.

Режимы масштабирования

Mode выбирает, откуда берётся базовый коэффициент:

Режим Базовый коэффициент Подходит для
Dpi (по умолчанию) Масштаб дисплея: 1 при 100 %, 1,5 при 150 % в параметрах экрана Windows. Инструментов, редакторов, интерфейса, который должен соответствовать ОС.
ReferenceResolution Размер окна, делённый на ReferenceSize. Игр: нарисовать один раз под 1920 × 1080 и масштабировать под любое окно.
None 1: одна единица — один пиксель. Интерфейса с точностью до пикселя, снимков экрана.

В режиме ReferenceResolution ReferenceFit решает, что делать, когда соотношение сторон окна отличается: Fit берёт меньшее отношение, чтобы вся опорная область всегда была видна; Fill берёт большее, чтобы заполнить окно, возможно выходя за его края.

UserScale умножает результат: это настройка «размер интерфейса», которую игроки ожидают увидеть в параметрах игры.

// The UI is designed for 1920 x 1080 and scales to fit the window; the player's UI size setting multiplies it.
public static void DesignFor1080p(IConfigurationBuilder ui, float playerUiScale) =>
    ui.ConfigureScaling(scaling =>
    {
        scaling.Mode = UIScaleMode.ReferenceResolution;
        scaling.ReferenceSize = new Size(1920, 1080);
        scaling.ReferenceFit = ReferenceFit.Fit;
        scaling.UserScale = playerUiScale;
    });

Отдельный Canvas может переопределить режим через Canvas.ScaleMode, например отладочный оверлей в режиме None. Действующий коэффициент — EffectiveScale.

Масштаб дисплея и манифест приложения

Режим Dpi читает масштаб дисплея через Windows. Для этого игра должна объявить себя поддерживающей DPI: файл app.manifest с поддержкой DPI PerMonitorV2. Без него Windows сообщает масштаб 1 и растягивает всё окно как растровое изображение, поэтому при 150 % текст выглядит размытым. Обе демонстрационные игры IcyUI поставляются с таким манифестом; скопируйте его оттуда.

Настройка размера интерфейса

Изменение UserScale сразу заново компонует интерфейс. Для такой настройки в меню параметров следуйте обычной схеме для настроек отображения: примените новый размер, попросите игрока подтвердить и через несколько секунд автоматически верните прежний, если подтверждения нет, чтобы нечитаемый размер не заблокировал игрока.

Типичные ошибки

  • Размеры в пикселях в собственной отрисовке. Если игра рисует рядом с интерфейсом, умножайте на EffectiveScale, чтобы совпадать с ним.
  • Смена монитора. В режиме Dpi перенос окна на монитор с другим масштабом меняет коэффициент; интерфейс сам заново выполняет компоновку.

См. также