14

我有一个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 增强请求”——所以我正在做一个,你也应该这样做。:)

4

1 回答 1

1

您需要尝试隔离您的问题。听起来您的图层层次结构不能很好地缩放并且变得太复杂了。

如果您使用较少的子类 CAShapeLayer 实例,您会看到相同的 CPU 活动吗?或者如果您尝试执行较少的动画?

于 2013-03-21T12:55:00.040 回答