2009-10-23 15 views
5

Core Animation utiliza un hilo de fondo para hacer su trabajo. Ahora el problema es este: tengo un cálculo pesado en el hilo principal. Core Animation se congela inmediatamente hasta que se realiza el cálculo. Y luego continúa terminando sus animaciones. Recuerdo haber leído en un documento que CA tiene una baja prioridad en el tiempo de procesamiento, lo que significa que lo que sea que el hilo principal quiera hacer es alto-prio y se hará con mayor probabilidad que cualquier animación de fantasía al mismo tiempo.¿Hay alguna manera de forzar Core Animation para que ejecute su hilo?

Quiero forzar Core Animation para programar su hilo de fondo muy bien con el hilo principal bajo ninguna circunstancia. O alternativamente, un hilo separado que ejecutará el cálculo pesado fuera del hilo principal. Ya lo intenté, pero CA todavía se congela hasta que lo haga. Espero que el planificador cambie el tiempo de procesamiento rápidamente entre CA y ese cálculo.

¿Cómo se puede obligar a CA a seguir trabajando? Si las cosas van un poco más lento que, está bien. Pero lo más importante es que todas las cosas continúan desde el punto de vista de los usuarios.

Respuesta

5

No ejecute cálculos pesados ​​en el hilo principal, ya que bloquearán la interfaz de usuario y provocarán una mala experiencia del usuario. Ejecútelos en un hilo de fondo.

Dicho esto, el iPhone es un sistema de un solo núcleo, por lo que si un cálculo está vinculando la CPU en un subproceso, el rendimiento de cada otro subprocesos puede detenerse casi por completo. Si puede, intente dividir su cálculo en elementos más pequeños y ejecútelos como NSOperations en NSOperationQueue. Si se asegura de que los segmentos de cálculo no son tan pequeños como para que la sobrecarga de la creación de una NSOperation para ellos sea demasiado grande, esto podría proporcionar un medio para estrangular el cálculo un poco para que sus animaciones no se ralenticen.

La animación principal tiende a realizar una serie de cálculos por adelantado, antes de que se ejecute una animación, por lo que puede verse ralentizada por su cadena de cálculo. También es posible que pueda comenzar su cálculo pesado dentro del método -animationDidStart: delegate para su CAAnimation, haciendo que el cálculo solo se inicie cuando la animación está en progreso. Creo que el progreso de una animación utiliza menos cálculos que su inicio, por lo que puede ser más capaz de coexistir con su cálculo pesado.

+0

Gracias. ¿NSOperations es capaz de hacer tiempos de espera? Mi cálculo ya está desglosado en pedazos. Cada uno está programado con un retraso de 0.05 segundos. Entonces, en realidad, hay algo de tiempo libre entremedio. Sin embargo, cuando CA tiene que hacer precalculaciones al principio, su idea de esperar -animationDidStart es goog. Lo intenté simplemente demorando la llamada para comenzar con el primer bloque de cálculos con 1 segundo. CA comienza a animar, luego entran en acción las pesadas calcinaciones y CA se congela. No ayuda. Estoy ejecutando los cálculos en un nuevo hilo. –

+0

El punto es que después de calcular cada bloque de datos, hay una actualización en la interfaz de usuario. Estas actualizaciones son rápidas y sin problemas, tal como se esperaba. Sería simplemente perfecto cuando hubiera una manera de programar todo esto de tal manera que CA comparta el tiempo de CPU con esto ... echaremos un vistazo a estas cosas de NSOperationQueue, aunque no suenan como que proporcionarían tiempos de espera como Las llamadas de selector de rendimiento demorado hacen (?) –

+0

NSOperationQueue crea subprocesos para sus NSOperations, según sea necesario.Es razonablemente inteligente sobre la administración de las tareas que se realizan cuando, pero no sé si tiene el mismo tipo de conciencia del nivel del sistema en el iPhone que en Snow Leopard (donde está superpuesto a GCD). También admite dependencias entre tareas, que puede utilizar aquí para su beneficio. –

-1

No estoy seguro, pero puede intentar llamar al [NSThread setThreadPriority:1.0] si ejecuta su CA en otro hilo.

+0

qué importa si llamo CA en otro hilo? Hasta donde yo sé, CA mantiene su propio proceso e hilo para este tipo de cosas (o al menos su propio hilo, con una configuración de prioridad muy baja) –

7

Se puede utilizar para eliminar la animación [CATransaction flush] núcleo si no deja que el runloop siga su curso

+0

Aunque parece que solo funciona en iOS 4.0 y hacia arriba. Antes de eso, no obliga a volver a dibujar correctamente, pero tampoco causa problemas. – monkeydom

+0

Sé que esto es antiguo, pero ¿te importaría explicar cómo '[CATransaction flush]' ayuda con el problema de subprocesos? – Warpling

Cuestiones relacionadas