Core Animation использует фоновый поток для выполнения своей работы. Теперь проблема в следующем: у меня в основном потоке выполняется тяжелый расчет. Core Animation немедленно зависает до тех пор, пока этот расчет не будет выполнен. А затем он продолжает заканчивать анимацию. Я помню, как читал в документе, что CA имеет низкий приоритет во времени обработки, а это означает, что все, что хочет сделать основной поток, является приоритетным и будет выполнено с большей вероятностью, чем любая модная анимация одновременно.
Я хочу заставить Core Animation планировать свой фоновый поток в соответствии с основным потоком при любых обстоятельствах. Или, в качестве альтернативы, отдельный поток, который будет выполнять тяжелые вычисления вне основного потока. Я уже пробовал это, но CA все еще зависает, пока это не будет сделано. Я ожидаю, что планировщик быстро переключит время обработки между CA и этим расчетом.
Как можно заставить CA продолжать работать? Если дела пойдут немного медленнее, это нормально. Но самое главное, чтобы все продолжалось с точки зрения пользователей.
Ответ 1 · рейтинг 5 · Brad Larson
Не выполняйте тяжелые вычисления в основном потоке, потому что они заблокируют пользовательский интерфейс и ухудшат взаимодействие с пользователем. Запустите их в фоновом потоке.
Тем не менее, iPhone - одноядерная система, поэтому, если вычисления привязаны к ЦП в одном потоке, производительность каждого другого потока может практически остановиться. Если можете, попробуйте разбить вычисление на более мелкие элементы и запустить их как NSOperations в NSOperationQueue. Если вы убедитесь, что сегменты вычислений не настолько малы, что накладные расходы на создание NSOperation для них станут слишком большими, это может предоставить средства для небольшого регулирования вычислений, чтобы ваши анимации не замедлялись.
Базовая анимация имеет тенденцию выполнять ряд вычислений заранее, прежде чем анимация может быть запущена, поэтому они могут замедляться из-за вашего тяжелого вычислительного потока. Вы также можете начать свои тяжелые вычисления в методе -animationDidStart: delegate для вашей CAAnimation, заставляя вычисление запускаться только во время анимации. Я считаю, что для продвижения анимации требуется меньше вычислений, чем для ее начала, поэтому она может лучше сосуществовать с вашими тяжелыми вычислениями.