0

他の方法では描画できない複雑なグラフィックを (drawRect 経由で) 描画するカスタム UIView を実装しました。描画されるアイテムは非常に大きな平面 (世界地図を考えてください) にあるため、メモリの制約により UIScrollView を使用できませんでした。独自の原点とズーム変数を管理し、それらに基づいてグラフィックを描画します。また、パン、ズームインとズームアウト、ダブルタップとシングルタップなどのジェスチャ認識機能も実装しました。すべてうまく機能します。

しかし、最適化が必要です。ユーザーが指でパンしているときに、それに応じて内部の原点変数を変更し、setNeedsDisplay を呼び出します。これはシミュレーターと iPhone 5 では問題なく動作しますが、iPad 3 では少し遅くなります (それほど悪くはありませんが、それでも目立ちます)。私が達成したいのは、表示する必要がある領域 (つまり、パンによって表示される画面に新しく到着したアイテム) に対してのみ setNeedsDisplay を呼び出し、既に画面に表示されていた領域をスクロール (シフト) することです。画面の 1/10 を表示すると、1/1 を表示するよりもはるかに高速になります。なぜなら、どの項目が画面に表示されるかをすばやく判断してそれらのみを表示する最適化を既に行っているからです。

つまり、呼び出す代わりに

thisView.originPoint = thisView.originPoint - 10;
[thisView setNeedsDisplay];

なんとか呼べたらいいのに

thisView.originPoint = thisView.originPoint - 10;
[thisView setNeedsDisplayInRect: CGMakeRect(320-10,0,320,480)
    withScroll: CGMakerect(0,0,320-10,480) scrollBy: CGPointMake(-10,0);

これは明らかに様式化されたコードです。ビューのコンテンツをスクロールするだけでは役に立ちません (現時点ではその方法はわかりません)。

4

1 に答える 1

0

ビューが完全に描画されたら、[self.layer renderInContext:aContext]andを使用して画面のイメージをキャッシュすることを検討してください。UIGraphicsGetImageFromCurrentImageContext()この画像は、ユーザーがパンすると、さまざまな場所に描画される可能性があります。ユーザーがドラッグすると左に移動します。一方、必要なデータも非同期でロードされます。ユーザーがドラッグを終了した後、またはデータがロードされた後、setNeedsDisplay が必要なセクションに描画できるようにフラグを設定し、新しい画像をキャッシュします。

また、CATiledLayerクラスは、探しているものと同様のことを行いますが、既にあるものにもう少し変更を加える必要があります。

お役に立てれば!

于 2013-04-02T03:28:46.650 に答える