Многозадачность, Высокое разрешение и Другие Функции 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
метод рисования, необходимо взять следующие шаги, чтобы гарантировать, что приложение не завершается в фоновом режиме:
В Вашем делегате приложения
applicationWillResignActive:
метод, Ваше приложение должно остановить свой таймер анимации (если таковые имеются), занять место в известное хорошее состояние, и затем вызватьglFinish
функция.В Вашем делегате приложения
applicationDidEnterBackground:
метод, Ваше приложение может хотеть удалить часть своего OpenGL , которому ES возражает для предоставления доступа к памяти и ресурсам доступными для приоритетного приложения. ВызовитеglFinish
функция, чтобы гарантировать, что ресурсы сразу удалены.После того, как Ваше приложение выходит из
applicationDidEnterBackground:
метод, это не должно делать новый OpenGL вызовами ES. Если это делает OpenGL вызовом ES, это завершается iOS.В Вашем приложении
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 обработать в четыре раза больше фрагментов. Если Ваше приложение выполняет много вычислений на фрагмент, увеличение пикселей может сократить частоту кадров. Если Вы находите, что Ваше выполнение приложения значительно медленнее в более высоком масштабном коэффициенте, рассмотрите одну из следующих опций:
Оптимизируйте свою производительность программы построения теней фрагмента с помощью настраивающих производительность инструкций, найденных в этом документе.
Реализуйте более простой алгоритм в своей программе построения теней фрагмента. Путем выполнения так, Вы сокращаете качество отдельных пикселей для рендеринга полного изображения в более высоком разрешении.
Используйте дробный масштабный коэффициент между 1,0 и и масштабный коэффициент экрана. Масштабный коэффициент 1,5 обеспечивает лучшее качество, чем масштабный коэффициент 1,0, но должен заполнить меньше пикселей, чем изображение, масштабируемое к 2,0.
Используйте форматы более низкой точности для Вашего
GLKView
объектdrawableColorFormat
иdrawableDepthFormat
свойства. Путем выполнения этого Вы сокращаете пропускную способность памяти, требуемую воздействовать на базовый renderbuffers.Используйте более низкий масштабный коэффициент и позвольте мультивыбрать. Добавленное преимущество состоит в том, что мультивыборка также обеспечивает более высокое качество на устройствах, не поддерживающих дисплеи с высокой разрешающей способностью.
Позволять мультивыбрать для a
GLKView
объект, измените значениеdrawableMultisample
свойство. Если Вы не представляете к представлению GLKit, необходимо вручную установить буферы мультивыборки и разрешить их прежде, чем представить заключительное изображение (см. Используя Мультивыборку для Улучшения Качества изображения).Мультивыборка не свободна; дополнительная память требуется, чтобы хранить дополнительные выборки и разрешение, что выборки в кадровый буфер решения занимают время. Если Вы добавляете мультивыборку к своему приложению, всегда тестируете производительность Вашего приложения, чтобы гарантировать, что это остается приемлемым.
Поддержка многократных интерфейсных ориентаций
Как любое приложение, OpenGL приложение ES должно поддерживать ориентации пользовательского интерфейса, надлежащие его содержанию. Вы объявляете поддерживаемые интерфейсные ориентации для своего приложения в его информационном списке свойств, или для контроллера представления, размещающего Ваш OpenGL содержание ES использование его supportedInterfaceOrientations
метод. (См. Руководство по программированию Контроллера Представления для iOS для подробных данных.)
По умолчанию, GLKViewController
и GLKView
классы обрабатывают изменения ориентации автоматически: Когда пользователь поворачивает устройство к поддерживаемой ориентации, система анимирует изменение ориентации и изменяет размер представления контроллера представления. Когда его размер изменяется, a GLKView
объект корректирует размер своего кадрового буфера и области просмотра соответственно. Если необходимо реагировать на это изменение, реализуйте viewWillLayoutSubviews
или viewDidLayoutSubviews
метод в Вашем GLKViewController
подкласс или реализация layoutSubviews
метод, если Вы используете пользовательское GLKView
подкласс.
При рисовании OpenGL содержание ES использование Базового Слоя анимации приложение должно все еще включать контроллер представления для управления ориентацией пользовательского интерфейса.
Представление OpenGL содержание ES на внешних дисплеях
Устройство на iOS может быть присоединено к внешнему дисплею. Разрешение внешнего дисплея и его масштабного коэффициента содержания может отличаться от разрешения и масштабного коэффициента основного экрана; Ваш код, представляющий кадр, должен корректироваться к соответствию.
Процедура для того, чтобы привлечь внешний дисплей почти идентична той работе основного экрана.
Создайте окно на внешнем дисплее путем выполнения шагов в Многократном Руководстве по программированию Дисплея для iOS.
Добавьте к окну надлежащее представление или просмотрите объекты контроллера для своей стратегии рендеринга.
При рендеринге с GLKit, установленными экземплярами
GLKViewController
иGLKView
(или Ваши пользовательские подклассы), и добавляют их к окну с помощьюrootViewController
свойство.При рендеринге к Базовому Слою анимации добавьте представление, содержащее уровень как подпредставление окна. Для использования цикла анимации для рендеринга создайте объект ссылки дисплея, оптимизированный для внешнего дисплея путем получения
screen
свойство окна и вызоваdisplayLinkWithTarget:selector:
метод.