14

レイヤー プロパティにサブレイヤーとして追加されUIViewたサブクラスのインスタンスがいくつかあります。CAShapeLayer

これらの各レイヤーの変更をアニメーション化してUIBezierPathいます。これは見栄えがよく、パフォーマンスも優れていますが、Instruments のアクティビティ モニターでプロセスを実行すると、プロセスの CPU が最大 90% に達します。backboardd

ここで何が起こっているかについての詳細情報を入手するにはどうすればよいですか? backboarddGPUでのCore Graphics / Core Animationの舞台裏のレンダリングですよね?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 に答える