Как сохранить физические размеры между разными iThings в Open GL?

Недавно я проснулся, поняв, что у нас, разработчиков iOS, теперь есть небольшой парк устройств с разными размерами и разрешениями экрана. В этой таблице показаны характеристики экрана развернутых в настоящее время устройств iOS:

http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density

Очень кстати. Теперь вот загадка:

Я создаю простое представление Open GL на своем iPad2. Мой код создает окно просмотра OpenGL с обычными размерами пикселей iPhone/Pad (320x480, 768x1024). Я рисую белый прямоугольник в этой штуке. Я делаю его шириной 200px. Мило. Старый добрый iPad.

Я компилирую тот же код (который автоматически определяет размеры экрана) в свой iPhone4. Мой белый прямоугольник не такой ширины, как на планшете. Справедливо. Я знаю, что реальные размеры в пикселях у iPhone4 — 640x960, а у iPad — 768x1024 с учетом ppi каждого устройства.

Разделив 768/640, я получаю хороший коэффициент масштабирования 1,2, который затем умножаю на 200 для ширины моего тестового прямоугольника и перекомпилирую для iPhone4... А-а-а... это почти работает. Ширина прямоугольника всего на несколько пикселей меньше, чем у его аналога на iPad.

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

Я создаю игру, и, конечно же, этот чертовски замечательный iPad3 имеет новое разрешение. Я пытаюсь абстрагироваться от как можно большего количества возможных ловушек разрешения. Вероятно, у меня не будет возможности протестировать свое приложение на iPad3 до его выпуска. Кто-нибудь еще в этой же лодке?


person CodeOwl    schedule 26.03.2012    source источник
comment
Я бы не стал масштабировать его по фактору деления большего размера экрана на размер маленького экрана. Я бы сделал это с коэффициентом деления PPI. Тем не менее, я бы не стал беспокоиться о физическом размере, если пропорции хорошие, этого должно быть достаточно (если только вам НЕ НУЖНО, чтобы физический размер оставался неизменным между устройствами, как в приложении линейки).   -  person EmilioPelaez    schedule 27.03.2012


Ответы (1)


Я понял свою проблему. Решение, которое я объяснил в своем последнем посте, совершенно благовидно.

OpenGL при рисовании моего тестового прямоугольника не заботится о разрешении в пикселях. Он заботится только о системе координат, которую вы ему подаете. Как и многие из вас, несомненно, я использую удобные размеры 320x480/768x1024 для систем координат в OpenGL для телефона/планшета.

Я упустил то, что 200 единиц «OpenGL-land» в системе iPhone[320/480] отличаются от 200 единиц в системе iPad[768/1024] нет из-за различий в разрешении экрана. , а потому, что соотношение 320/760 (или эквивалентно 480/1024) отличается от соотношения ширины или высоты экрана телефона/планшета. Я взял линейку и измерил размеры для себя, потому что не смог найти авторитетных, достоверных цифр в Интернете.

Ширина экрана iPhone: 5,05 см Ширина экрана iPad: 14,8 см

Легко заметить, что 5.05/14.8 отличается от 320/768.

Во всяком случае, «истинное» отношение сантиметров к единицам OpenGL на iPhone составляет 5,05/320, а эквивалент iPad — 14,8/768.

Коэффициент масштабирования между ними равен x:

14.8/768 = x(5.05/320)

0.01927083333333 = x*0.01578125

= 1,221 (ближайшая тысячная)

Итак, я вернулся к своему коду для iPhone, и теперь я увеличил ширину тестового прямоугольника до 1,221 * 200 и оставил тестовый прямоугольник равным 200 в своем коде для iPad. Пересобрал оба. На этот раз мой белый тестовый прямоугольник имеет одинаковую ширину как на iPad2, так и на iPhone4.

OpenGL не обращает внимания на плотность пикселей. Он обращает внимание на свою систему координат. Вот почему эта техника работает. Может быть, это немного сумасшествие точно сохранять физические размеры, но я могу спать немного спокойнее, зная, что есть решение, если оно мне понадобится.

Тысячелетний сокол, Алекс

person CodeOwl    schedule 27.03.2012