Высокочастотные дисплеи
Высокочастотные дисплеи
Высокочастотные дисплеи — это дисплеи с повышенной плотностью пикселей по сравнению со стандартными дисплеями с высокой плотностью пикселей.
Эта плотность пикселей измеряется в точках на дюйм (DPI) или пикселях на дюйм (PPI) и определяется количеством пикселей дисплея и его физическими размерами. Это означает, что количество пикселей само по себе недостаточно для определения, относится ли дисплей к категории высокочастотных.
4K-монитор имеет фиксированное количество пикселей (~8 млн), однако DPI варьируется от 185 (23 дюйма) до 110 (40 дюймов). Первый вариант примерно в 2 раза превышает стандартное разрешение рабочего стола 96 DPI, а второй — чуть больше.
Проблемы с высокочастотными дисплеями
Высокочастотные дисплеи вызывают ряд проблем для существующих приложений:
- Приложения, использующие интерфейсные элементы с фиксированными координатами, выглядят маленькими. Сочетание указания размера шрифта в пунктах и других размеров в пикселях особенно проблематично, поскольку пункты не зависят от разрешения монитора. Например, рамка размером 40x20 пикселей вокруг текста «hello» с шрифтом 12 пунктов выглядит правильно на мониторах с низким разрешением, но на мониторах с высокой частотой обновления она будет слишком мала, что приведет к обрезке текста.
- Приложения должны адаптироваться к ситуациям, когда пользователи имеют несколько дисплеев с различным разрешением. Например, они могут использовать 4K-монитор для окна документа в графическом редакторе и монитор с низким разрешением для инструментальной панели.
Традиционный подход к поддержке высокочастотных дисплеев заключался в автоматическом масштабировании шрифтов Qt и предоставлении значения DPI, которое код приложения мог использовать для масштабирования остальной части пользовательского интерфейса.
Обзор поддержки высокочастотных дисплеев в Qt
Qt поддерживает режим высокой частоты обновления, в котором основная система координат виртуализируется и делается независимой от плотности пикселей дисплея. Этот режим реализован в некоторых операционных системах (macOS, iOS). Кроме того, Qt содержит реализацию, которую можно использовать в случаях, когда поддержка операционной системы отсутствует.
Геометрия теперь задается в независимых от устройства пикселях. Это включает геометрию виджетов и элементов, геометрию событий, геометрию рабочего стола, окна и экрана, а также скорости анимации. Выводимый рендеринг выполняется в пикселях устройства, что соответствует разрешению дисплея. Отношение между системами координат независимых и пиксельных устройств — это devicePixelRatio.
Приложения в основном работают с независимыми от устройства пикселями. Заметными исключениями являются OpenGL и код, работающий с растровой графикой.
Поддержка операционных систем
Операционные системы, поддерживаемые Qt, обеспечивают следующую поддержку высокочастотных дисплеев:
macOS и iOS
Платформы Apple реализуют масштабирование и виртуализацию системы координат в операционной системе. Обычно специальная настройка не требуется.
Примечание: На macOS поддержка высокочастотных дисплеев активируется настройками в файле Info.plist. Убедитесь, что они присутствуют.
<key>NSPrincipalClass</key> <string>NSApplication</string> <key>NSHighResolutionCapable</key> <string>True</string>
Более новые версии qmake будут генерировать Info.plist с ключом NSPrincipalClass, что достаточно, поскольку NSHighResolutionCapable по умолчанию имеет значение true.
Примечание: macOS и iOS могут применять дополнительную виртуализацию, так что пиксели устройства не соответствуют 1:1 пикселям дисплея. Это происходит на iPhone 6+ и на macOS, настроенной с включенным «масштабированием дисплея».
Microsoft Windows
Масштабирование
Пользователь может выбрать коэффициент масштабирования в панели управления или через контекстное меню. Это работает, заставляя функции запроса системных метрик возвращать разные значения для стандартных размеров шрифтов, размеров рамок окон и т. д. Это не выполняет никакого фактического масштабирования.
Осведомленность о DPI
Приложение в Windows может принять один из следующих уровней «осведомленности о DPI»:
| Уровень осведомленности о DPI | Значение |
|---|---|
| Неосведомленность о DPI | Этот уровень был введен в Windows Vista. Windows будет имитировать для приложения, что оно работает на стандартном дисплее с разрешением 96 DPI 1920x1080 и масштабировать приложение соответственно. Это предназначено для поддержки более старых приложений, разработанных для дисплеев с низкой частотой обновления. В результате такого масштабирования могут возникнуть некоторые артефакты. |
| Осведомленность о DPI системы | Этот уровень был введен в Windows Vista. Он отличается от уровня осведомленности о DPI каждого монитора только при подключении нескольких мониторов. Windows рассчитает масштабирование, подходящее для всех подключенных мониторов. |
| Осведомленность о DPI каждого монитора | Этот уровень был введен в Windows 8.1. Windows вообще не выполняет никакого масштабирования. |
Приложения Qt по умолчанию являются осведомленными о DPI каждого монитора в Windows 8.1 или осведомленными о DPI системы в более старых версиях Windows. Начиная с Qt 5.4, уровень можно указать, передав параметр плагину платформы (см. Использование qt.conf):
<application> -platform windows:dpiawareness=0,1,2
Поддержка высокочастотных дисплеев в Qt
- Возможность предоставления пиктограмм или графики для высококачественных дисплеев: см. Отрисовка высококачественных версий пиктограмм и изображений.
- Qt 5.6 поддерживает кроссплатформенное масштабирование высокочастотных дисплеев для устаревших приложений, аналогично масштабированию, выполняемому напрямую macOS. Это позволяет приложениям, написанным для экранов с низкой частотой обновления, работать без изменений на устройствах с высокой частотой обновления. Эта функция включается по умолчанию и может быть включена с помощью следующих переменных среды:
-
QT_AUTO_SCREEN_SCALE_FACTOR[логическое значение] включает автоматическое масштабирование на основе плотности пикселей монитора. Это не изменит размер шрифтов, размер которых задается в пунктах, поскольку пункт — это физическая единица измерения. Несколько экранов могут получить разные коэффициенты масштабирования. -
QT_SCALE_FACTOR[числовое значение] определяет глобальный коэффициент масштабирования для всего приложения, включая шрифты с размером в пунктах. -
QT_SCREEN_SCALE_FACTORS[список] указывает коэффициенты масштабирования для каждого экрана. Это не изменит размер шрифтов, размер которых задается в пунктах. Эта переменная среды в основном полезна для отладки или для решения проблем с мониторами с неправильной информацией EDID(расширенные данные идентификации дисплея).Формат может быть либо списком, разделенным точкой с запятой, коэффициентов масштабирования в том же порядке, что и в QGuiApplication::screens(), или списком, разделенным точкой с запятой,
name=valueпар, гдеnameсовпадает с QScreen::name().
Хотя стиль macOS полностью поддерживает высокочастотные дисплеи, настольный стиль Windows в настоящее время имеет некоторые ограничения при определенных коэффициентах масштабирования. В таких случаях рассмотрите возможность использования стиля Fusion вместо него, который нацелен на поддержку высокочастотных дисплеев во всех случаях.
Примечание: Нецелочисленные коэффициенты масштабирования могут вызвать значительные артефакты масштабирования/рисования.
-
- Атрибут приложения
Qt::AA_EnableHighDpiScaling, введенный в Qt 5.6, включает автоматическое масштабирование на основе плотности пикселей монитора. - Атрибут приложения
Qt::AA_DisableHighDpiScaling, введенный в Qt 5.6, отключает все масштабирование. Это предназначено для приложений, которым необходимо использовать фактические координаты систем окон независимо от переменных среды. Этот атрибут имеет приоритет над Qt::AA_EnableHighDpiScaling. - Экспериментальная реализация масштабирования высокочастотных дисплеев была введена в Qt 5.4. Она была включена переменной среды
QT_DEVICE_PIXEL_RATIO, которая могла быть задана как числовой коэффициент масштабирования или"auto". Эта переменная устарела в Qt 5.6.
Миграция существующих приложений
Чтобы быстро запустить приложение, разработанное для низких значений DPI, на мониторах с высоким разрешением, рассмотрите один из вариантов масштабирования (позвольте приложению работать как неосведомленным о DPI в Windows или задайте переменную среды QT_AUTO_SCREEN_SCALE_FACTOR в значение "1". Однако эти варианты могут привести к некоторым артефактам масштабирования или рисования.
В долгосрочной перспективе приложение следует адаптировать, чтобы оно работало без изменений:
- Всегда используйте qreal-версии API рисования QPainter.
- Изменяйте размеры окон и диалоговых окон относительно размера экрана.
- Замените жестко закодированные размеры в макетах и коде рисования значениями, рассчитанными на основе метрик шрифтов или размера экрана.
Словарь терминов высокочастотных дисплеев
| Термин | Определение |
|---|---|
| Пиксели, независимые от устройства | Пиксели, используемые приложением (пространство пользователя), которые масштабируются операционной системой или Qt. |
| Пиксели устройства | Пиксели устройства дисплея. |
| Коэффициент пикселей устройства | Коэффициент масштабирования, применяемый операционной системой или Qt. |
| Логическая частота DPI | Разрешение, используемое для преобразования размеров шрифтов, определенных в пунктах, в размеры шрифтов в пикселях. Обычно это одно из стандартных значений 96, 128, .. 192. |
| Физическая частота DPI | Физическое разрешение, полученное путем деления размера монитора на количество пикселей. |
| Дисплей Retina | См. Википедия по дисплеям Retina |
| Пространство пользователя | Координатное пространство, используемое приложением (Пиксели, независимые от устройства). |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/highdpi.html