CADisplayLink и drawRect

Мне нужна помощь, чтобы лучше понять, как CADisplayLink себя CADisplayLink и drawRect , так что я могу понять, как сохранить частоту кадров моего приложения на гладкой 60 кадров в секунду. До сих пор мое (предположительно неверное) понимание заключается в следующем:

1) CADisplayLink вызывает указанный селектор, когда дисплей обновляется (так называемое событие «v-sync», примерно каждые 16 мс).

2) iOS использует двойную буферизацию, что означает, что пока отображается один буфер буфера, мы можем подготовить (обратить) к другому, а два будут заменены на следующее событие v-sync.

3) Таким образом, с момента срабатывания линии отображения у меня около 16 мс, чтобы убедиться, что все вычисления и чертеж, необходимые для следующего кадра, были завершены, так что все готово к тому времени, когда буферы будут заменены, и экран обновится.

4) Метод drawRect пользовательского UIView обращается к заднему буферу, поэтому любой пользовательский чертеж отображается в следующем событии v-sync после drawRect метода drawRect .

Так ли это работает? (И что произойдет, если следующее событие v-sync произойдет до того, как я закончу рисование в задний буфер?)

Затем, как я должен использовать CADisplayLink для перерисовки пользовательских UIViews? Я попытался вызвать setNeedsDisplay всякий раз, когда появляется ссылка на изображение, но есть задержка до начала метода drawRect:

 2014-12-10 19:17:21.000 myApp[39487:60b] Display link fired. 2014-12-10 19:17:21.001 myApp[39487:60b] Sending setNeedsDisplay 2014-12-10 19:17:21.012 myApp[39487:60b] drawRect beginning 2014-12-10 19:17:21.013 myApp[39487:60b] drawRect finished 2014-12-10 19:17:21.017 myApp[39487:60b] Display link fired. 2014-12-10 19:17:21.018 myApp[39487:60b] Sending setNeedsDisplay 2014-12-10 19:17:21.029 myApp[39487:60b] drawRect beginning 2014-12-10 19:17:21.031 myApp[39487:60b] drawRect finished 2014-12-10 19:17:21.033 myApp[39487:60b] Display link fired. 

Это очень упрощенный пример, при котором практически не выполняется рисование в методе drawRect . Некоторые из моих более сложных drawRects могут занять до 10 мс. Но есть только 5 мс между тем, когда начинается drawRect и обновляется следующий дисплей! Кроме того, существует 11 целых миллисекунд, видимо «потраченных впустую» между стрельбой на экране и началом drawRect! Как я могу использовать это время?

Если я попытаюсь вызвать drawRect непосредственно в селекторе ссылок на изображение, я получаю что-то вроде этого:

 2014-12-10 19:24:41.000 myApp[39495:60b] Display link fired. 2014-12-10 19:24:41.001 myApp[39495:60b] Sending setNeedsDisplay 2014-12-10 19:24:41.002 myApp[39495:60b] drawRect beginning 2014-12-10 19:24:41.003 myApp[39495:60b] drawRect finished 2014-12-10 19:24:41.016 myApp[39495:60b] Display link fired. 2014-12-10 19:24:41.017 myApp[39495:60b] Sending setNeedsDisplay 2014-12-10 19:24:41.018 myApp[39495:60b] drawRect beginning 2014-12-10 19:24:41.020 myApp[39495:60b] drawRect finished 2014-12-10 19:24:41.032 myApp[39495:60b] Display link fired. 

Теперь у моего кода рисования есть много времени для выполнения. Однако в документации Apple явно указано, что «вы никогда не должны напрямую обращаться к методу drawRect ». Так почему же это неправильно? И как я могу максимально использовать 16 коротких миллисекунд, которые я должен нарисовать каждый кадр?

Давайте будем гением компьютера.