Высокочастотные дисплеи
Высокочастотные дисплеи
Высокочастотные дисплеи — это дисплеи с повышенной плотностью пикселей по сравнению со стандартными дисплеями с высокой плотностью пикселей.
Эта плотность пикселей измеряется в точках на дюйм (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» в 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.9/highdpi.html