CALayer で shouldRasterize = YES を設定した場合、アニメーションのパフォーマンスを向上させるために階層全体をフラットにしたい場合、各サブレイヤーにも設定する必要がありますか?
ルートレイヤーで shouldRasterize = YES を設定し、Instruments で「Color Blended Layers」を有効にすると、すべてのサブレイヤーがまだそこにあり、ブレンド済みとしてマークされているため、質問しています。それは何も平坦化していません。
CALayer で shouldRasterize = YES を設定した場合、アニメーションのパフォーマンスを向上させるために階層全体をフラットにしたい場合、各サブレイヤーにも設定する必要がありますか?
ルートレイヤーで shouldRasterize = YES を設定し、Instruments で「Color Blended Layers」を有効にすると、すべてのサブレイヤーがまだそこにあり、ブレンド済みとしてマークされているため、質問しています。それは何も平坦化していません。
設定shouldRasterize
は、あなたが考えていることをまったく実行しません。ラスタライズされているかどうかにかかわらず、親ビューの外観を合成するには、サブビューをチェックしてopaque
透明かどうかを確認する必要があります。子オブジェクトがopaque
の場合、ブレンドする必要はありません。それらが透明な場合、ビューはその背後 (または階層の上位) にあるものとブレンドする必要があります。
そのため、shouldRasterize
Instruments を使用して表示される緑/赤には影響しません。すべてを緑色にするには、透明度を使用せず、すべての子オブジェクトを にする必要がありますopaque
。デザインによっては、赤い領域が残ってしまうことが避けられない場合があります。インストゥルメントは、可能性のあるものを最適化しopaque
、GPU が行う必要のあるブレンドの量を減らすのに役立ちます。
編集:さらに説明するためUILabel
に、写真の上に があり、その上に座っているとします。背景色ではなくテキストのみを表示する必要があるため、テキストbackgroundColor
をクリアに設定し、opaque
プロパティを NO に設定します。楽器では、これは赤く表示されます。GPU は、1 回ではなく 2 回の描画操作を実行して、この透明度を背後の画像にブレンドする必要があります。
単色の背景色を設定opaque
しYES
て与えた場合、そのビューを他のビューとブレンドする必要がないため、ビューはインストゥルメントで緑色に表示されます。
そのため、レイヤーがラスタライズされているかどうかにかかわらず、子ビューを合成する必要があるためshouldRasterize
、Instruments で表示されるものには影響しません。