web-dev-qa-db-ja.com

CALayer-シャドウがパフォーマンスに影響を与える?

だから私は自分のナビゲーションコントローラーでカスタムアニメーションを実行し、viewControllerをプッシュおよびポップする方法を実行しています。

すべてがスムーズに実行されます。次のコード(UINavigationControllerのサブクラス)を追加するとすぐに、パフォーマンスが大幅に低下します。影を追加すると、すべてのアニメーションが非常に遅延します。これは予想されたものですか、それともコードで何か問題がありますか?

// This code gets called once during NavigationController initialization.
[self.view setClipsToBounds:NO];
[self.view.layer setCornerRadius:5];
[self.view.layer setShadowOffset:CGSizeMake(0, 20)];
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]];
[self.view.layer setShadowRadius:20.0];
[self.view.layer setShadowOpacity:1];

編集:

シャドウの半径を1に変更したが、まだ遅い

30
aryaxt

シャドウを追加すると速度が低下するはずです。 20のshadowRadiusは非常に高く、特に遅くなります。

シャドウのレンダリング速度を向上させるもう1つのキー: shadowPath プロパティを設定します。それは劇的に役立ちます。

49
Kurt Revis
self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;

最近、遅いCALayerシャドウでいくつかの問題がありました。その単純なコード行ですべてが修正されました!

84
williamcotton

shadowPathの代わりにshadowOffsetを使用します。

theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath;

この投稿を確認してください: iphone-ビューのシャドウがオンの場合、アニメーションのパフォーマンスが非常に低下します

15
Bobo Shone

はい、影は非常に高価です(特に大きな影-半径を操作すると、経験する減速の度合いに大きな違いがあることに気付くでしょう)。パフォーマンスを向上させる1つの方法は、イメージをCGImageContextに一度レンダリングして、レイヤーを再描画するたびにシャドウを再レンダリングするのではなく、そのイメージを表示することです(ただし、シャドウをアニメーション化する必要がある場合は機能しません)か何か)。

2
Ian Henry