Есть ли способ заставить Core Animation запустить его поток? - PullRequest
5 голосов
/ 23 октября 2009

Core Animation использует фоновый поток для своей работы. Теперь проблема заключается в следующем: у меня тяжелый расчет в основном потоке. Базовая анимация немедленно останавливается, пока не будет выполнен этот расчет. И затем он продолжает заканчивать свою анимацию. Я помню, как читал в документе, что CA имеет низкий приоритет во время обработки, что означает, что все, что хочет сделать основной поток, является высокоприоритетным и будет выполняться с большей вероятностью, чем любая причудливая анимация одновременно.

Я хочу заставить Core Animation правильно планировать фоновый поток с основным потоком при любых обстоятельствах. Или, в качестве альтернативы, отдельный поток, который будет выполнять тяжелые вычисления вне основного потока. Я уже пробовал это, но CA все еще зависает, пока это не сделано. Я ожидаю, что планировщик быстро переключит время обработки между CA и этим вычислением.

Как можно заставить CA продолжать работать? Если дела идут немного медленнее, это нормально. Но самое главное, что все продолжается с точки зрения пользователей.

Ответы [ 3 ]

7 голосов
/ 02 мая 2011

Вы можете использовать [CATransaction flush] для очистки основной анимации, если вы не позволяете runloop развиваться

5 голосов
/ 23 октября 2009

Не выполняйте интенсивные вычисления в главном потоке, потому что они заблокируют пользовательский интерфейс и приведут к ухудшению работы пользователя. Запустите их в фоновом потоке.

Тем не менее, iPhone является одноядерной системой, поэтому, если вычисление привязывает ЦП к одному потоку, производительность каждого другого потока может снизиться. Если вы можете, попробуйте разбить ваш расчет на более мелкие элементы и запустить их как NSOperations в NSOperationQueue. Если вы убедитесь, что сегменты вычислений не настолько малы, что накладные расходы на создание NSOperation для них становятся слишком большими, это может обеспечить возможность немного уменьшить вычисления, чтобы не замедлять анимацию.

Базовая анимация имеет тенденцию выполнять ряд вычислений заранее, до того, как анимация может быть запущена, поэтому они могут замедляться вашим тяжелым потоком вычислений. Вы также можете начать тяжелые вычисления в методе -animationDidStart: делегат для вашей CAAnimation, благодаря чему вычисление запускается только во время анимации. Я полагаю, что для развития анимации требуется меньше вычислений, чем для ее начала, поэтому она может лучше сосуществовать с вашими тяжелыми вычислениями.

0 голосов
/ 23 октября 2009

Я не уверен, но вы можете попробовать позвонить [NSThread setThreadPriority:1.0], если вы запускаете свой ЦС в другом потоке.

...