有没有办法强制Core Animation运行它的线程?

时间:2009-10-23 17:38:25

标签: iphone multithreading performance core-animation

Core Animation使用后台线程来完成它的工作。现在的问题是:我在主线程中进行了大量的计算。核心动画立即冻结,直到计算完成。然后它继续完成它的动画。我记得在一份文件中读到CA在处理时间方面的优先级较低,这意味着无论主线程想要做什么都是高prio,并且比同时任何花哨的动画更有可能。

我想在任何情况下强制Core Animation在主线程中很好地安排它的后台线程。或者是一个单独的线程,它将在主线程之外运行繁重的计算。我已经尝试过了,但CA仍然会冻结,直到完成。我希望调度程序能够在CA和计算之间快速切换处理时间。

CA如何被迫继续工作?如果事情变得有点慢,那很好。但最重要的是,从用户的角度来看,所有事情都在继续。

3 个答案:

答案 0 :(得分:7)

如果你不让runloop走上正轨,你可以使用[CATransaction flush]来刷新核心动画

答案 1 :(得分:5)

不要在主线程上运行繁重的计算,因为它们会阻止UI并导致糟糕的用户体验。在后台线程中运行它们。

也就是说,iPhone是一个单核系统,所以如果计算在一个线程中盯住CPU,那么每个其他线程的性能可能会接近停止。如果可以的话,尝试将计算分解为更小的元素,并在NSOperationQueue中将它们作为NSOperations运行。如果你确保计算段不是那么小,以至于为它们创建NSOperation的开销变得太大,这可能会提供一种限制计算的方法,这样你的动画就不会变慢。

在动画可能运行之前,Core Animation会提前执行大量计算,因此繁重的计算线程可能会减慢这些计算速度。您也可以在CAAnimation的-animationDidStart:delegate方法中开始繁重的计算,使计算仅在动画进行时启动。我相信动画的进度使用的计算量少于它的开始时间,因此它可以更好地与繁重的计算共存。

答案 2 :(得分:-1)

我不确定,但如果您在其他主题中运行CA,则可以尝试调用[NSThread setThreadPriority:1.0]