我有一个UIView
子类的几个实例CAShapeLayer
作为子层添加到其层属性。
我正在UIBezierPath
对这些层中的每一个进行动画更改,这看起来很棒并且性能很好,但是当我通过Instruments 中的Activity Monitor运行它时,它会在进程上达到约 90% 的 CPU 。backboardd
我怎样才能获得有关这里发生的事情的更多信息?backboardd
是 GPU 上核心图形/核心动画的幕后渲染,对吧?是否支持在某个地方的 Instruments 中进行进一步调试?我可以用GCD做一些花哨的事情来减少负载backboardd
吗?
编辑:在与 Apple 将其升级为 TSI 后,他们已经确认这是这么多动画 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 增强请求”——所以我正在做一个,你也应该这样做。:)