Проблемы точности CADisplayLink с OpenGL ES на iOS - PullRequest
2 голосов
/ 30 января 2012

Моя игра для iOS в настоящее время использует CADisplayLink для синхронизации операций рендеринга OpenGL.У меня есть очередь отправки GCD, запущенная во втором потоке, который выдает все вызовы OpenGL и вызовы состояния для GPU.Все работает отлично, кроме времени не идеально.Я иногда вижу пропуски и сбои кадров, даже когда интервал анимации изменяется с 1 (60 Гц) на 2 (30 Гц).

CADisplayLink вызывает ваш селектор из RunLoop в главном потоке, что означает егоможет запускаться только между другими отправленными заданиями и входными событиями, которые обрабатывает основной поток.(Я подтвердил, что это так, регистрируя эти задания / события).Если эти операции занимают несколько миллисекунд, то CADisplayLink никогда не будет абсолютно точным, потому что он не может прерывать то, что в данный момент выполняется в главном потоке.Как я полагаю, большинство игр делают, я запускаю симуляцию игр, физику и выборку сцен в главном потоке.

Итак, я думаю, что мне следует убрать все игровые симуляторы и физику сосновной поток, чтобы события касания и CADisplayLink могли запускаться как можно ближе к тому времени, когда это должно быть возможно.Но я не уверен, что это что-то решит, и это не тривиальный объем работы.

Мне интересно, поскольку вызов presentRenderBuffer действительно синхронизирует ваш кадр с фактическим аппаратным отображением, может быть,все, что мне нужно, это просто очень точный таймер, который может работать в своем собственном потоке (возможно, с более высоким приоритетом) и таким образом запускать рендеринг.Тогда я могу держать все в главном потоке.Кажется, все, что предоставляет CADisplayLink, - это способ ожидания в случае, когда мой код работает быстрее 60 Гц, поэтому мне кажется, что аналогичный тип задержки можно кодировать так же легко, используя отдельный поток.Что мне здесь не хватает?

...