2009-10-23 2 views
5

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

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

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

ответ

5

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

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

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

+0

Спасибо. Является ли NSOperations способным делать тайм-ауты? Мой расчет уже разбит на куски. Каждый из них запланирован с задержкой 0,05 секунды. Так что на самом деле есть некоторое свободное время между ними. Однако, когда CA должен делать предварительные таблицы в начале, ваша идея ждать -animationDidStart - это goog. Я попробовал это, просто задерживая вызов для начала с первого блока вычислений с 1 секундой. CA начинает анимировать, затем становятся тяжелыми вычислениями, и CA замерзает. Это не помогает. Я выполняю вычисления в новом потоке. – 2009-10-23 18:51:58

+0

Дело в том, что после вычисления каждого блока данных в пользовательском интерфейсе происходит обновление. Эти обновления бывают быстрыми и гладкими, как и ожидалось. Это было бы просто идеально, когда был бы способ запланировать все это таким образом, что CA будет делиться временем CPU с этим ... будет смотреть на эти вещи NSOperationQueue, хотя они не похожи на то, что они будут предоставлять таймауты, такие как delayed performSelector calls do (?) – 2009-10-23 18:53:58

+0

NSOperationQueue создает потоки для ваших NSOperations по мере необходимости.Разумно разумно управлять тем, какие задачи выполняются, но я не знаю, имеет ли он тот же уровень осведомленности на уровне системы на iPhone, что и на Snow Leopard (где он накладывается поверх GCD). Он также поддерживает зависимости между задачами, которые вы можете использовать в своих интересах здесь. –

-1

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

+0

это имеет значение, если я позвоню CA в другом потоке? насколько я знаю, CA поддерживает собственный процесс и поток для такого рода материалов (или, по крайней мере, это собственный поток с очень низким приоритетом) – 2009-10-23 18:55:18

7

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

+0

Хотя это работает только на iOS 4.0 и выше. До этого он не заставляет правильно перерисовывать, но также не вызывает проблем. – monkeydom

+0

Я знаю, что это старо, но не могли бы вы понять, как '[CATransaction flush]' помогает с проблемой потоковой передачи? – Warpling

Смежные вопросы