2012-05-22 8 views
1

Я использую OpenGL ES для создания пользовательского интерфейса пользовательского интерфейса на iOS. Вариант использования для приложения, как и в случае, который не будет обновляться на основе кадра (например, в игре). Из того, что я вижу до сих пор, кажется, что поведение GLKViewController по умолчанию - это перерисовать экран со скоростью около 30 кадров в секунду. Типично для пользовательского интерфейса при необходимости только перерисовывать, чтобы уменьшить использование ресурсов, и я бы не хотел откачивать дополнительную энергию от батареи, используя GPU, пока пользователь ничего не делает.iOS OpenGL ES - только рисовать по запросу

Я попробовал только очистить и нарисовать экран один раз в качестве теста и получил предупреждение от профайлера о том, что отображается неинициализированный буфер цветов.

Глядя на него, я нашел эту документацию: http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Reference/EAGLDrawable_Ref/EAGLDrawable/EAGLDrawable.html

В документации говорится, что есть флаг, kEAGLDrawablePropertyRetainedBacking, который при установке на YES, позволит BackBuffer сохранить вещи, сделанные к нему в предыдущем кадре. Тем не менее, в нем также говорится, что это не рекомендуется и вызывают проблемы с производительностью и памятью, и именно этого я и стараюсь избегать в первую очередь.

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

+1

Нужно ли использовать GLKViewController? Не так сложно свернуть собственный хостинг OpenGL ES и контроллер просмотра, который обновляет его только тогда, когда это необходимо. Это то, что все мы должны были сделать до iOS 5.0. –

+0

Интересно, я не понимал, что это вариант (я очень новичок в разработке iOS). Я посмотрю на это. – phosphoer

+0

Я ссылаюсь на пару примеров приложений в [этом ответе] (http://stackoverflow.com/a/2858658/19679), один более простой, чем другой. Оба создают собственные пользовательские представления и контроллеры представлений, а обновления обрабатываются вручную или через прерыватель CADisplayLink. –

ответ

2

В этом случае вы не должны использовать GLKViewController, так как его основная цель - предоставить простой таймер анимации в основном цикле. Вместо этого ваше представление может принадлежать любому другому подклассу UIViewController (включая одно из вашего собственного создания), и вы можете полагаться на обычную систему setNeedsDisplay/drawRect, используемую всеми другими видами UIKit.

+0

Очень просветительская, спасибо за ответ! – phosphoer

1

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

Вы всегда можете установить paused на GLKViewController, чтобы приостановить цикл рендеринга.

+0

Не знал о приостановленном свойстве, это звучит как довольно хорошее решение. Будет ли это также приостанавливать цикл обновления (GLKViewControllerUpdate)? – phosphoer

+0

Да, свойство 'paused' останавливает' GLKViewController' от обновления и рендеринга 'GLKView'. Это идеально, если вы хотите использовать 'setNeedsDisplay' для рендеринга на основе нерегулярных изменений (например, пользовательский ввод), а затем иногда анимировать на основе таймера обновления. Например, если вы перетаскиваете что-то, а затем отпускаете, и оно возвращается, вы должны отключить контроллер до окончания анимации весны, а затем приостановить его до тех пор, пока это не понадобится. – jhabbott