Выполнение точной синхронизации на вызовах iOS OpenGL ES в целом немного сложнее из-за использования отложенных средств рендеринга на основе плиток для устройств.Изменения состояния, рисование и другие действия могут быть отложены до непосредственного представления сцены.
Это часто может привести к тому, что что-то вроде glFlush()
или -presentRenderBuffer:
контекста будет выглядеть очень медленным, хотя на самом деле это просто вызывает выполнение всего отложенного рендеринга в этой точке.
Это не повлияет на ваш случай, когда вы закомментируете весь код для рисования, но glClear()
.Переменные тайминги, которые вы представляете в своем чередующемся примере, примерно соответствуют 1/53 или 1/33 секунды, что, как мне кажется, указывает на то, что он может просто блокироваться достаточно долго, чтобы соответствовать частоте обновления экрана.CADisplayLink должен поддерживать синхронизацию с обновлением экрана, но я мог иногда видеть, что ваш рисунок немного не соответствует этому.
Вы запускаете этот тест в главном потоке?Может быть что-то, что вызывает небольшую блокировку основного потока, слегка сбивая вас с времени обновления экрана.Я видел уменьшение этого вида колебаний, когда я переместил рендеринг в фоновый поток, но все же он был вызван CADisplayLink.Скорость рендеринга также увеличилась, как и я, особенно на многоядерном iPad 2.
Наконец, я не думаю, что вам нужно явно использовать glFlush()
при использовании OpenGL ES на iOS.Ваш EAGLContext * метод presentRenderbuffer:
должен быть всем, что требуется для отображения вашего кадра на экране.Я не вижу ни одного экземпляра glFlush()
в моем приложении OpenGL ES здесь.В вашем случае это может быть избыточно.