CADisplayLink y drawRect

Necesito ayuda para comprender mejor cómo se comportan CADisplayLink y drawRect , de modo que pueda descubrir cómo mantener la velocidad de fotogtwigs de mi aplicación a una velocidad de 60 fps. Mi comprensión (presumiblemente incorrecta) hasta el momento es la siguiente:

1) CADisplayLink llama a un selector específico cuando la pantalla se actualiza (un evento llamado "v-sync", aproximadamente cada 16 ms).

2) iOS utiliza el doble almacenamiento en búfer, lo que significa que mientras se muestra un búfer de cuadro, podemos preparar (dibujar a) el otro y los dos se intercambian en el siguiente evento de synchronization v.

3) Por lo tanto, desde el momento en que se dispara el enlace de visualización, tengo aproximadamente 16 ms para garantizar que todos los cálculos y el dibujo requeridos para el siguiente fotogtwig se hayan completado, de modo que todo esté listo para cuando se cambien los búferes y se actualice la pantalla.

4) El método drawRect de una UIView personalizada dibuja en el búfer de respaldo, por lo que cualquier dibujo personalizado se muestra en el siguiente evento de synchronization en v una vez que se llama al método drawRect .

¿Es así como realmente funciona? (¿Y qué pasa si el próximo evento de synchronization v ocurre antes de terminar de dibujar en el búfer posterior?)

Entonces, ¿cómo debería usar CADisplayLink para volver a dibujar UIViews personalizadas? Intenté llamar a setNeedsDisplay cada vez que se dispara el enlace de la pantalla, pero hay un retraso antes de que comience realmente el método drawRect:

 2014-12-10 19:17:21.000 myApp[39487:60b] Display link finetworking. 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 finetworking. 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 finetworking. 

Este es un ejemplo muy simplificado, casi sin dibujar en el método drawRect . Algunos de mis drawRects más complejos pueden tardar hasta 10 ms en completarse. Pero solo hay 5ms entre cuando se inicia drawRect y la próxima pantalla se actualiza. Además, hay 11 milisegundos completos aparentemente "desperdiciados" entre el disparo del enlace de la pantalla y el comienzo drawRect. ¿Cómo hago uso de ese time?

Si trato de llamar a drawRect directamente en el selector de enlace de pantalla, obtendré algo como esto:

 2014-12-10 19:24:41.000 myApp[39495:60b] Display link finetworking. 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 finetworking. 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 finetworking. 

Ahora mi código de dibujo parece tener mucho time para ejecutarse. Sin embargo, la documentation de Apple establece explícitamente que "nunca debería llamar directamente al método drawRect ". Entonces, ¿por qué esto es algo incorrecto? ¿Y cómo aprovecho al máximo los 16 milisegundos cortos que tengo para dibujar cada fotogtwig?