15

self.layer.shouldRasterize = YES;UIViews でフラグを使用した経験を共有したいと思います。

スクロールのパフォーマンスを向上させるためにオンになっているクラス階層があります (それらすべてUIViewデバイスの画面よりも大きい STATIC サブビューを持っています)。self.layer.shouldRasterize

今日はサブクラスの 1 つを使用CAEmitterLayerして、素敵なパーティクル エフェクトを作成しました。

粒子の数が非常に少ない (50 個の粒子) にもかかわらず、パフォーマンスは非常に貧弱です。

この問題の原因は何ですか?

4

2 に答える 2

38

Apple Doc を引用して説明します。

@property BOOL shouldRasterize

このプロパティの値が YES の場合、レイヤーはローカル座標空間でビットマップとしてレンダリングされ、他のコンテンツと一緒に宛先に合成されます。フィルター プロパティの影の効果とすべてのフィルターはラスタライズされ、ビットマップに含まれます。ただし、レイヤーの現在の不透明度はラスタライズされていません。合成中にラスター化されたビットマップのスケーリングが必要な場合は、必要に応じて minificationFilter プロパティとmaggingFilter プロパティのフィルターが適用されます。

したがって、基本的に shouldRasterize が YES に設定されている場合、レイヤーを構成するすべてのピクセルが計算され、レイヤー全体がビットマップとしてキャッシュされます。

  • いつ恩恵を受けますか?

一度だけ描画する必要がある場合。つまり、CoreAnimation はフレームごとに再描画せずに実際にそのレイヤーを使用するため、純粋な「単純な」アニメーション (移動、変換、スケーリングなど) だけが必要な場合を意味します。CoreAnimation と組み合わせて複雑なレイヤー (影と角の半径を含む) をキャッシュする非常に強力な機能です。

  • いつフレームレートを殺しますか?

レイヤーが何度も再表示shouldRasterizeされると、既に有効になっている描画の上に、がすべてのピクセルを処理してビットマップ データをキャッシュするためです。

したがって、あなたが自問すべき本当の質問は次のとおりですshouldRasterize

これが十分に明確であることを願っています。

于 2012-07-17T12:35:26.063 に答える
11

self.layer.shouldRasterizeをオフにすると、パフォーマンスが通常のレベルに向上します。

何故ですか?

アップルの開発者サイトのビデオによると(ビデオを思い出せません、助けてください?)self.layer.shouldRasterizeのルールは非常に単純です:すべてのサブビューが静的である場合(位置、コンテンツなどが変更またはアニメーション化されていない場合) )次に、self.layer.shouldRasterizeをオンにするとメリットがあります。一方、サブビューのいずれかが変更されている場合、フレームワークはビュー階層を再キャッシュする必要があり、これは大きなボトルネックになります。内部的には、ボトルネックはCPUとGPU間のメモリコピーです。

于 2012-07-17T12:04:00.187 に答える