Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Есть ли способ заставить Core Animation запускать поток?

Автор вопроса: CommunityОтветов: 3

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

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

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

iphonemultithreadingcore-animationperformance

Ответы

Ответ 1 · рейтинг 5 · Brad Larson

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

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

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

Ответ 2 · рейтинг 7 · monkeydom

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

Ответ 3 · рейтинг -1 · Morion

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы