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перенос окна на монитор с другим масштабом меняет коэффициент; интерфейс сам заново выполняет компоновку.