У меня есть UIView
с несколькими экземплярами подкласса CAShapeLayer
, добавленными как подслои к свойству слоя.
Я оживляю изменения в UIBezierPath
для каждого из этих уровней, который выглядит потрясающе и работает, , но достигает ~ 90% CPU в процессе backboardd
, когда я запускаю его через Монитор активности в Инструментах.
Как я могу получить дополнительную информацию о том, что происходит здесь? backboardd
- это закулисный рендеринг материала Core Graphics/Core Animation на графическом процессоре, верно? Есть ли поддержка для дальнейшей отладки в Инструментах где-то? Могу ли я сделать что-то необычное с GCD, чтобы загрузить backboardd
меньше?
РЕДАКТИРОВАТЬ:. После эскалации этого в TSI с Apple они подтвердили, что это "ожидаемое поведение" для этого количества анимированных CAShapeLayers. Вздох. Они предложили предложение по этой ссылке, которое предполагает постоянную приостановку и приостановку анимации, чтобы имитировать более низкую частоту кадров. (Так как это вычисления для каждого кадра анимации с блокировкой DisplayLink, которые захлопываются backboardd
)
-(void)pauseLayer:(CALayer*)layer {
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer {
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
Наконец, хорошая технология Apple указала, что управление рамкой анимации анимации "сделает достойный запрос на улучшение API, как в сторону" - поэтому я делаю один, и вы тоже должны.:)