2012-06-15 21 views
9

UIScrollViewとその内部にUIImageViewsを持つオブジェクト(UIViewコンポジション)の数があります。いくつかのUIImageViewsには境界線があります(これにはmyImageView.layer.masksToBounds = YES;を使用します)。他の矩形の罫線と画像の一部があります(これはInterface BuilderでClip subviewsプロパティを使用しています)。clipToBoundsとmasksToBoundsパフォーマンスの問題

問題は、私はスクロールしながらそのクリップのプロパティが強く、パフォーマンスに影響を与えたということです:

iPod touch(第4世代)、プロファイリングの結果を得るため

:有効にクリップのプロパティ(の両方またはいずれかで

  • それら)

をスクロールしながら、私は本当に私はすべての60のFPSを持つ無効クリップのプロパティで

  • をスクロールしながら、私は約30 FPSを持っていますラウンド境界にいくつかのイメージをクリップする必要があります(イメージの一部を表示するために)他の四角形の境界にクリップする必要があります。だから、ここに私の質問です:パフォーマンスを向上させるにはどのような方法がありますか?低レベルの方法(drawRect:または何か)があるかもしれませんか、またはアルファマスキングの周りを遊ぶのに役立つかもしれませんか、私はちょうど何か間違っていますか?

  • 答えて

    30

    あなたがグラフィックを多用マスクやものを持っている場合は、パフォーマンス(しばしば大幅に)を改善するためのシンプルで簡単な方法は、その項目の層の上にYESshouldRasterizeを設定することです:

    #import <QuartzCore/QuartzCore.h> 
    
    // ... 
    
    view.layer.shouldRasterize = YES; 
    

    これはrastersizeますビューをバッファに入れるので、常に再レンダリングされるわけではありません。これは、各ビューのための余分なメモリを占有するので、実際にテーブルビューのやり方と同様に、スクロールしながらビューを再利用/再利用する必要があります。

    あなたも rasterizationScaleのために適切な値を設定する必要が網膜ディスプレイ上の正しい動作のために

    view.layer.rasterizationScale = view.window.screen.scale; // or [UIScreen mainScreen] 
    

    私は、各項目が角を丸めたフォトギャラリーをスクロールするようなもの、のためにこれで大きな成功を収めてきました、陰影など

    +0

    良いアドバイス!今では、このプロパティを全体のビュー(丸みを帯びたイメージビューとテキストラベルの内側)に適用すると本当に役に立ちます。この場合、テキストはとても醜いものになります。丸みを帯びたイメージビューにのみ適用すると、ほとんど効果がありません。 – Lloyd18

    +1

    ああ、申し訳ありません。網膜のサポートのために、 'view.layer.rasterizationScale = [[UIScreen mainScreen] scale]'を設定します。それはすべてを鮮明にするはずです。私は私の答えを更新しました。 –

    +0

    あなたのメモリ使用量を確認するために覚えておいてください。ラスタライズを使用するときは、「Activity Monitor」計測器を使用してメモリ使用量の違いを確認します。余分なビデオメモリは、おそらく割り当てに表示されません。増加が大きすぎる場合は、私が言ったようにビューをリサイクルしてみてください。そのため、一度にインスタンスがあまりにも多くないようにしてください。 –

    関連する問題