Я отказываюсь от этого. Разумеется, я могу привязывать элементы по краям, что сделало бы мое разрешение интерфейса независимым ... пока оно не изменится настолько сильно, что графика станет слишком маленькой. Как правильно масштабировать при необходимости? Как мне сохранить графику в правильном соотношении при масштабировании? Я не хочу, чтобы они растягивались, если разрешение имеет другую пропорцию, например 16:10, в отличие от всего остального.
Есть ли верный и проверенный подход к этому? Видеопроигрыватели показывают черные границы из-за этой проблемы, это не правильно решаемо?
xna
resolution
Blub
источник
источник
Ответы:
Прежде всего, имейте в виду, что с растеризацией технически не существует такой вещи, как истинная независимость разрешения. При достаточно большом увеличении отдельные тексели начнут становиться видимыми. Единственное решение этого - написать систему векторной графики.
При этом существует несколько шагов для создания надежной независимой от разрешения системы растрового изображения: определение размеров, системы координат и макет.
Для определения размера и позиционирования нам нужно использовать некоторый набор единиц, которые поддерживают соотношение с фактическим разрешением приложения. В этом случае давайте используем дюймы, потому что я американец, и вы можете масштабировать элементы с DPI (точек на дюйм). Например, допустим, ваше приложение работает с разрешением 800x600. По умолчанию Windows DPI 96. Это означает, что приложение имеет разрешение (800/96) x (600/96) дюймов или 8,33x6,25 дюймов.
Так как вам нужно уметь работать, как минимум, с соотношением сторон 4: 3 и 16: 9, то, как вы справляетесь с вашей системой координат экрана, становится немного сложнее. Что я рекомендую сделать, так это поместить (0,0) в центр области отображения (а также окна и элементы управления). Это хорошо работает, потому что если вы поместите (0,0) в угол, то, поскольку этот угол перемещается в зависимости от разрешения и соотношения сторон, он будет переводить все ваши спрайты, тогда как центр экрана всегда будет центром экрана. независимо от устройства. Если продолжить наш пример с 800x600, это приведет к созданию системы координат, которая (слева направо) от -4,165 дюйма до 4,165 дюйма и (сверху вниз) от 3,125 дюйма до -3,125 дюйма.
Таким образом, на данный момент у вас есть независимая от DPI система пользовательского интерфейса с элементами, которые всегда будут находиться в одном и том же месте относительно центра экрана - не совсем независимо от разрешения. К счастью, независимость DPI позволяет вам масштабировать пользовательский интерфейс путем масштабирования DPI на основе некоторой эвристики. Например, мы можем масштабировать DPI, используя вертикальное разрешение в качестве нашей эвристики. Если 800x600 - 96 DPI, мы будем использовать 123 DPI для 1024x768 или 115 DPI для 1280x720.
Наконец, вам нужно построить систему макетов, которая обрабатывает как абсолютное позиционирование, так и относительное позиционирование. Прекрасными примерами этого являются WPF и Интернет. Вы можете указать, что элементы управления / блоки заполняют несколько% родительского элемента, пристыковывая его к краю, наряду со многими другими полезными автоматическими параметрами макета. Все это вместе приведет к тому, что система пользовательского интерфейса будет выглядеть практически одинаково в разных разрешениях и пропорциях.
Подводя итог, я настоятельно рекомендую вам изучить WPF, поскольку он делает почти все это, за исключением того, что он поддерживает начало координат в системе координат верхнего левого угла и не автоматически масштабирует DPI на основе вертикального разрешения.
источник
Как правило, то, что вы хотите сделать, зависит от игры.
Один из вариантов - иметь черные границы, если пропорции (пропорции) отличаются (возможно, проще всего, просто отрендерить в текстуру, затем отрендерить это на экран, изменив размеры соответствующим образом).
Другой вариант - использовать разные пути рендеринга для разных форматов изображения. Вы можете иметь один для широкоэкранного, другой для «нормального».
Еще один вариант - масштабировать вещи отдельно, например, увеличивать или уменьшать окно сообщения пользовательского интерфейса в зависимости от разрешения. Всякий раз, когда вам нужно решить, где рисовать, вместо использования точных пикселей, делайте такие вещи, как 0,2 вниз, 0,8 в поперечнике, ширина 0,1, высота 0,3. Очевидно, что в этом случае вы получите растяжение вещей, хотя в зависимости от того, как вы рисуете вещи, которые могут быть хорошими (например, растянуть фон пользовательского интерфейса, но не текст).
С точки зрения 3D, если вы правильно настроили область просмотра, вы должны получить широкоэкранные плееры, способные видеть чуть больше, чем не широкоэкранные настройки. (альтернативно нарисуйте черные границы / или растяните вид).
источник