Как мне сделать разрешение независимой системы?

10

Я отказываюсь от этого. Разумеется, я могу привязывать элементы по краям, что сделало бы мое разрешение интерфейса независимым ... пока оно не изменится настолько сильно, что графика станет слишком маленькой. Как правильно масштабировать при необходимости? Как мне сохранить графику в правильном соотношении при масштабировании? Я не хочу, чтобы они растягивались, если разрешение имеет другую пропорцию, например 16:10, в отличие от всего остального.

Есть ли верный и проверенный подход к этому? Видеопроигрыватели показывают черные границы из-за этой проблемы, это не правильно решаемо?

Blub
источник
1
Смотрите [этот] [1] вопрос. Мой ответ объясняет некоторые кровавые детали. [1]: gamedev.stackexchange.com/questions/34/…
инженер

Ответы:

5

Прежде всего, имейте в виду, что с растеризацией технически не существует такой вещи, как истинная независимость разрешения. При достаточно большом увеличении отдельные тексели начнут становиться видимыми. Единственное решение этого - написать систему векторной графики.

При этом существует несколько шагов для создания надежной независимой от разрешения системы растрового изображения: определение размеров, системы координат и макет.

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

Corillian
источник
-1

Как правило, то, что вы хотите сделать, зависит от игры.

Один из вариантов - иметь черные границы, если пропорции (пропорции) отличаются (возможно, проще всего, просто отрендерить в текстуру, затем отрендерить это на экран, изменив размеры соответствующим образом).

Другой вариант - использовать разные пути рендеринга для разных форматов изображения. Вы можете иметь один для широкоэкранного, другой для «нормального».

Еще один вариант - масштабировать вещи отдельно, например, увеличивать или уменьшать окно сообщения пользовательского интерфейса в зависимости от разрешения. Всякий раз, когда вам нужно решить, где рисовать, вместо использования точных пикселей, делайте такие вещи, как 0,2 вниз, 0,8 в поперечнике, ширина 0,1, высота 0,3. Очевидно, что в этом случае вы получите растяжение вещей, хотя в зависимости от того, как вы рисуете вещи, которые могут быть хорошими (например, растянуть фон пользовательского интерфейса, но не текст).

С точки зрения 3D, если вы правильно настроили область просмотра, вы должны получить широкоэкранные плееры, способные видеть чуть больше, чем не широкоэкранные настройки. (альтернативно нарисуйте черные границы / или растяните вид).

Джордж Дакетт
источник
«просто визуализируем в текстуру, а затем визуализируем это на экране, изменяя размеры соответствующим образом». Нет. Это создаст очень размытое и странно выглядящее изображение. А что если разрешение слишком низкое? Все станет нечитаемым.
Тара
Продолжайте читать, это один из немногих вариантов. Вы бы точно не поняли проблемы, которые вы описали (хотя, если бы все делалось просто / неправильно, тогда да, это было бы размыто и растянуто и т. Д.)
Джордж Даккет
Я продолжал читать. Но ваш ответ очень неопределенный. Также вы определенно получите проблемы, которые я описал, потому что вы не можете просто визуализировать все в низком разрешении и ожидать, что текст останется идеально читаемым.
Тара
Я не говорю, что рендеринг с более низким разрешением, чем цель, хотя очевидно, что рендеринг с более высоким разрешением также может привести к появлению артефактов. Мой ответ тоже мог бы быть конкретизирован, однако, поскольку уже есть хороший принятый ответ, я не вернусь к этому. Я упоминал рендеринг текста специально, так как он немного отличается от выбора места (и размера) для рисования чего-либо, но это правда, что это было очень кратко и могло быть разработано.
Джордж Даккет
Я также не говорил, рендеринг с более низким разрешением, чем цель. Вы просто не можете взять пользовательский интерфейс 1: 1 и визуализировать его с более низким разрешением, чем было задумано (это я имел в виду с более низким разрешением).
Тара