15

CALayer で shouldRasterize = YES を設定した場合、アニメーションのパフォーマンスを向上させるために階層全体をフラットにしたい場合、各サブレイヤーにも設定する必要がありますか?

ルートレイヤーで shouldRasterize = YES を設定し、Instruments で「Color Blended Layers」を有効にすると、すべてのサブレイヤーがまだそこにあり、ブレンド済みとしてマークされているため、質問しています。それは何も平坦化していません。

4

1 に答える 1

11

設定shouldRasterizeは、あなたが考えていることをまったく実行しません。ラスタライズされているかどうかにかかわらず、親ビューの外観を合成するには、サブビューをチェックしてopaque透明かどうかを確認する必要があります。子オブジェクトがopaqueの場合、ブレンドする必要はありません。それらが透明な場合、ビューはその背後 (または階層の上位) にあるものとブレンドする必要があります。

そのため、shouldRasterizeInstruments を使用して表示される緑/赤には影響しません。すべてを緑色にするには、透明度を使用せず、すべての子オブジェクトを にする必要がありますopaque。デザインによっては、赤い領域が残ってしまうことが避けられない場合があります。インストゥルメントは、可能性のあるものを最適化しopaque、GPU が行う必要のあるブレンドの量を減らすのに役立ちます。

編集:さらに説明するためUILabelに、写真の上に があり、その上に座っているとします。背景色ではなくテキストのみを表示する必要があるため、テキストbackgroundColorをクリアに設定し、opaqueプロパティを NO に設定します。楽器では、これは赤く表示されます。GPU は、1 回ではなく 2 回の描画操作を実行して、この透明度を背後の画像にブレンドする必要があります。

単色の背景色を設定opaqueYESて与えた場合、そのビューを他のビューとブレンドする必要がないため、ビューはインストゥルメントで緑色に表示されます。

そのため、レイヤーがラスタライズされているかどうかにかかわらず、子ビューを合成する必要があるためshouldRasterize、Instruments で表示されるものには影響しません。

于 2012-09-12T13:53:33.167 に答える