我有一个UIView
,其子类CAShapeLayer
的几个实例作为子图层添加到其图层属性中。
我为这些图层中的UIBezierPath
设置了动画更改动画,这看起来非常棒且效果很好,但在我backboardd
进程时达到~90%CPU通过仪器中的活动监视器运行它。
如何获取有关此处发生的更多信息? backboardd
是GPU上核心图形/核心动画的幕后渲染,对吗?是否支持在某处进行仪器的进一步调试?我可以用 GCD 做些喜欢加载backboardd
吗?
编辑:在将此升级为与Apple的TSI之后,他们已经确认这是此数量的动画CAShapeLayers的“预期行为”。叹。他们确实提出了一个建议at this link,其中包括不断暂停和取消暂停动画以模仿较低的帧速率。 (因为它是关闭每个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增强请求,而不是” - 所以我要制作一个, and you should, too 。 :)
答案 0 :(得分:1)
您需要尝试隔离您的问题。听起来你的图层层次结构不能很好地扩展并且变得太复杂了。
如果使用较少的子类CAShapeLayer实例,您是否看到相同的CPU活动?或者,如果您尝试执行较少的动画?