iOSオフスクリーンレンダリングの解析と処理方法
画面やレイヤーを、画面に直接描画するのではなく、GPU レベルで描画するオフスクリーンレンダリング
- 角丸りや影あり:ビューやレイヤーに角丸や影などのエフェクトが設定されていると、オフスクリーンレンダリングが発生する。これは、角丸や影はビューやレイヤーを切り抜いたりブレンドしたりする処理が必要で、直接画面上でレンダリングできないため。
対処方法:可能な限り、角丸のビューやシャドウのあるビューでオフスクリーンレンダリングを使用しないようにします。 オフスクリーンレンダリングがトリガされるのを減らすには、以下の方法があります。
- 離散レンダリングの回数を減らすため、`UIView` の `layer.cornerRadius` プロパティを置き換えて、`CALayer` の `cornerRadius` プロパティを使用します。
- UIViewの影関連のプロパティ(shadowColor, shadowOffset等)より、可能な限りCALayerの影関連のプロパティ(shadowOpacity, shadowColor, shadowOffset等)で影を実装してください。
- 透明度が1より小さい属性をビューやレイヤーが設定すると、オフスクリーン描画がトリガされます。これは、透明度の計算ではビューやレイヤーのクリッピングと合成操作が必要となるためです。
オフスクリーンレンダリングは、不透明度が 1 未満のビューまたはレイヤー上で可能な限り使用しないようにします。オフスクリーンレンダリングの発生を軽減する方法を以下に示します。
- ビューやレイヤーの不透明度を1に設定するか、不透明度1未満の設定は可能な限り回避します。
- 透明度を持つビューにサブビューを追加すると、ビュー階層の複雑さが増すため、可能な限り避けてください。
- マスク
- ラスター化するべきかどうか
対処策: 上記の的属性および操作の使用を極力避けるか、適切に利用すること。オフスクリーンレンダリングの発生を軽減するには、以下の方法が考えられる
- マスク属性を持つビュー上でオフスクリーンレンダリングを使用しないでください。
- shouldRasterizeプロパティを適切に設定し、不要なオフスクリーンレンダリングを回避する。
iOSでオフスクリーンレンダリングを回避するために、まず
- 角丸処理や影などのエフェクトはできるだけ使わないか、控えめにする
- ビューとレイヤーの不透明度はできるだけ1よりも大きくする。
- mask、shouldRasterize プロパティは極力避けるか、適切な使用を心がける。
適正な処理や最適化を図ることで、離れ画面描画がiOSアプリのパフォーマンスに及ぼす影響を低減し、アプリの滑らかさと応答速度を向上できます。