Многозадачность, Высокое разрешение и Другие Функции iOS

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

Реализация многозадачно-осведомленного OpenGL приложение ES

Когда пользователь переключается на другое приложение, Ваше приложение может продолжать работать. Для полного обсуждения многозадачности на iOS посмотрите состояния Приложения и Многозадачность.

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

Фоновые приложения могут не выполнить команды на аппаратном обеспечении машинной графики

 Приложение ES OpenGL завершается, если оно пытается выполнить команды OpenGL ES на аппаратном обеспечении машинной графики. iOS препятствует тому, чтобы фоновые приложения получили доступ к графическому процессору так, чтобы frontmost приложение всегда было в состоянии представить большой опыт пользователю. Ваше приложение может быть завершено, не только если оно делает OpenGL вызовами ES, в то время как в фоновом режиме, но также и если ранее представленные команды сбрасываются к GPU в то время как в фоновом режиме. Ваше приложение должно гарантировать, что все ранее представленные команды закончили выполняться прежде, чем переместиться в фон.

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

Если Вы представляете команды OpenGL ES снаружи a, если Вы не используете представления GLKit или просматриваете контроллеры или GLKView метод рисования, необходимо взять следующие шаги, чтобы гарантировать, что приложение не завершается в фоновом режиме:

  1. В Вашем делегате приложения applicationWillResignActive: метод, Ваше приложение должно остановить свой таймер анимации (если таковые имеются), занять место в известное хорошее состояние, и затем вызвать glFinish функция.

  2. В Вашем делегате приложения applicationDidEnterBackground: метод, Ваше приложение может хотеть удалить часть своего OpenGL , которому ES возражает для предоставления доступа к памяти и ресурсам доступными для приоритетного приложения. Вызовите glFinish функция, чтобы гарантировать, что ресурсы сразу удалены.

  3. После того, как Ваше приложение выходит из applicationDidEnterBackground: метод, это не должно делать новый OpenGL вызовами ES. Если это делает OpenGL вызовом ES, это завершается iOS.

  4. В Вашем приложении applicationWillEnterForeground: метод, воссоздайте любые объекты и перезапустите свой таймер анимации.

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

Удалите легко воссозданные ресурсы прежде, чем переместиться в фон

Ваше приложение никогда не требуется, чтобы высвобождать OpenGL объекты ES, когда это перемещается в фон. Обычно, Ваше приложение должно избежать избавляться от своего содержания. Рассмотрите два сценария:

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

  •  Когда пользователь запускает другой OpenGL приложение ES, Ваше приложение ES OpenGL в фоновом режиме. Если для того приложения нужно больше памяти, чем доступно на устройстве, система тихо и автоматически завершает Ваше приложение, не требуя, чтобы он выполнил какую-либо дополнительную работу.

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

Вот то, как необходимо обработать эти два сценария:

  • Ваше приложение должно сохранить текстуры, модели и другие активы в памяти; от ресурсов, занимающих много времени для воссоздавания, никогда нельзя избавляться, когда приложение перемещается в фон.

  • Ваше приложение должно избавиться от объектов, которые могут быть быстро и легко воссозданы. Ищите объекты, использующие большие объемы памяти.

Простые цели являются кадровыми буферами, которые Ваше приложение выделяет для содержания результатов рендеринга. Когда Ваше приложение в фоновом режиме, это не видимо пользователю и может не представить новое содержание с помощью OpenGL ES. Это означает, что память, использованная кадровыми буферами Вашего приложения, выделяется, но не полезна. Кроме того, содержание кадровых буферов является переходным; большая часть приложения воссоздает содержание кадрового буфера каждый раз, когда они представляют новый кадр. Это делает renderbuffers интенсивно использующим память ресурсом, который может быть легко воссоздан, став хорошим кандидатом на объект, от которого можно избавиться при перемещении в фон.

Если Вы используете представление GLKit и просматриваете контроллер, GLKViewController когда Ваше приложение перемещается в фон, класс автоматически избавляется от кадровых буферов своего связанного представления. Когда приложение перемещается в фон, при ручном создании кадровых буферов для другого использования необходимо избавиться от них. В любом случае необходимо также рассмотреть то, от чего других переходных ресурсов приложение может избавиться в то время.

Поддержка дисплеев с высокой разрешающей способностью

По умолчанию, значение представления GLKit contentScaleFactor свойство соответствует масштаб экрана, содержащего его, таким образом, его связанный кадровый буфер сконфигурирован для рендеринга в полном разрешении дисплея. Для получения дополнительной информации о том, как дисплеи с высокой разрешающей способностью поддерживаются в UIKit, видят Поддерживающие Экраны С высокой разрешающей способностью В Представлениях.

При представлении OpenGL содержание ES использование Базового Слоя анимации его масштабный коэффициент установлен в 1.0 по умолчанию. Для рисования в полном разрешении дисплея Сетчатки необходимо изменить масштабный коэффициент CAEAGLLayer возразите для соответствия масштабного коэффициента экрана.

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

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

Поддержка многократных интерфейсных ориентаций

Как любое приложение, OpenGL приложение ES должно поддерживать ориентации пользовательского интерфейса, надлежащие его содержанию. Вы объявляете поддерживаемые интерфейсные ориентации для своего приложения в его информационном списке свойств, или для контроллера представления, размещающего Ваш OpenGL содержание ES использование его supportedInterfaceOrientations метод. (См. Руководство по программированию Контроллера Представления для iOS для подробных данных.)

По умолчанию, GLKViewController и GLKView классы обрабатывают изменения ориентации автоматически: Когда пользователь поворачивает устройство к поддерживаемой ориентации, система анимирует изменение ориентации и изменяет размер представления контроллера представления. Когда его размер изменяется, a GLKView объект корректирует размер своего кадрового буфера и области просмотра соответственно. Если необходимо реагировать на это изменение, реализуйте viewWillLayoutSubviews или viewDidLayoutSubviews метод в Вашем GLKViewController подкласс или реализация layoutSubviews метод, если Вы используете пользовательское GLKView подкласс.

При рисовании OpenGL содержание ES использование Базового Слоя анимации приложение должно все еще включать контроллер представления для управления ориентацией пользовательского интерфейса.

Представление OpenGL содержание ES на внешних дисплеях

Устройство на iOS может быть присоединено к внешнему дисплею. Разрешение внешнего дисплея и его масштабного коэффициента содержания может отличаться от разрешения и масштабного коэффициента основного экрана; Ваш код, представляющий кадр, должен корректироваться к соответствию.

Процедура для того, чтобы привлечь внешний дисплей почти идентична той работе основного экрана.

  1. Создайте окно на внешнем дисплее путем выполнения шагов в Многократном Руководстве по программированию Дисплея для iOS.

  2. Добавьте к окну надлежащее представление или просмотрите объекты контроллера для своей стратегии рендеринга.

    • При рендеринге с GLKit, установленными экземплярами GLKViewController и GLKView (или Ваши пользовательские подклассы), и добавляют их к окну с помощью rootViewController свойство.

    • При рендеринге к Базовому Слою анимации добавьте представление, содержащее уровень как подпредставление окна. Для использования цикла анимации для рендеринга создайте объект ссылки дисплея, оптимизированный для внешнего дисплея путем получения screen свойство окна и вызова displayLinkWithTarget:selector: метод.