En iOS, ¿cómo se puede lograr una animation fluida?

¿Es cierto que para Angry Birds o Cut the Rope, dibujan primero todo el marco de la pantalla completa (la vista completa) y luego pintan todo el marco en la pantalla, haciendo que la animation sea suave?

Esto se debe a que si animamos una bola de metal, de un tamaño de 20 x 20 píxeles, y si eliminamos la bola primero y luego dibujamos la bola en una nueva location, entonces podría haber un parpadeo muy sutil pero notable.

Lo mismo podría ser si está animado por drawRect , que borrará toda la pantalla, y luego dibujará todo en sus nuevas ubicaciones, que podrían tener incluso más parpadeo que antes?

Volviendo al método de dibujo de cuadro completo: si una pelota estaba en coorderadas (100,100), y ahora la pelota está pintada encima de la captura de pantalla completa (con el nuevo background expuesto), en la coorderada (103, 100), entonces es muy imperceptible para los cambios. (no desapareciendo y luego reapareciendo sucediendo en absoluto).

¿Cómo se puede lograr una animation suave que se parezca a Angry Birds o al juego Cut the Rope?

Hacen uso de OpenGL, que es mucho más rápido que cualquiera de los methods de cuarzo (es decir, drawRect) ya que hace uso de la GPU en lugar de la CPU para renderizar. Usar Quartz puede ser cientos o miles de veces más lento dependiendo de lo que esté haciendo exactamente.

Si no quieres recurrir a OpenGL. Puede poner el object dentro de una UIView y luego animarlo. Siempre que el contenido de la vista sea estático, esto es bastante rápido para la mayoría de las aplicaciones. Por ejemplo, al hacer que el background sea una vista y la bola de metal una vista, puede mover esa vista y lograr animaciones muy suaves sin problemas.

Use CALayers. Son más ligeros que las vistas.

Si una aplicación usa OpenGL, la respuesta es sí, hace su renderización antes de que el búfer de ttwig se presente a la pantalla. Creo que las otras forms de dibujar en la pantalla usan la misma técnica de dibujo en un búfer fuera de la pantalla antes de transferir la image completa a la pantalla, pero no estoy tan seguro de eso.