0

背景画像とCGPath、ユーザーが画面に触れると変更されるビューがあります。で画像をCGContextDrawImage()描画し、その上にパスを描画するのは十分に高速ではなく、タッチ イベントのパフォーマンスを妨げます。私がしたいのは、ビットマップバッファーを持ち、パスの変更のみを描画することです。したがって、ビューdrawRect()はバッファを描画するだけです。sを使用する必要があると思わCGContextれますが、その方法がわかりません。これを最適化する別の方法はありますか?

編集:

ユーザーが画面に触れるたびにパスに追加しています。したがって、「パスの変更」とは、既存のパスにさらにポイントを追加することを指します。これが、毎回全体を描画するのではなく、画像をバッファーしてパスの「デルタ」だけを描画できると思う理由です。現時点で、私の描画とイベント ロジックは次のようなものです。

-(void)drawRect{
    //Draw the background image
    //Draw the whole path
}

-(void)touchesMoved{
    //Add the touch point to the path
    [self setNeedsDisplay];
}

このように背景を描画すると、パスだけを描画する場合よりも、タッチ イベント サンプリングのパフォーマンスが著しく低下します。

4

4 に答える 4

1

背景画像が変更されていない場合 (変更されているかどうかはわかりません)、背景画像を別の CoreAnimation レイヤーに配置し、その上にパスを含むレイヤーを配置する必要があります。これにより、-drawRect ですべてを行うのではなく、GPU が合成を処理できるようになります。可能な場合は背景画像をキャッシュすることができ、更新する必要があるのはパスだけです (おそらく、フレームごとに完全に再描画することを避けることができます)。背景画像への影響を気にすることなく、パスの拡大縮小や回転などを行うこともできます。

于 2009-02-02T22:48:17.760 に答える
0

実際、それはすでにそれが機能する方法とほとんど同じです。drawRectに渡されたコンテキストは、CALayerに描画されます。これは、ビューがそれ自体を再描画する必要がある何かを実行するまでバッファリングされます。「ユーザーが画面に触れると」パスが変更されるとおっしゃいましたが、ビューにsetNeedsDisplayを設定していますか?

あなたが本当に毎回異なるパスを持っているなら、あなたはそれをバッファリングすることができないでしょう。同じ場合、setNeedsDisplayを呼び出していない限り、または呼び出しに影響を与える何かを呼び出していない限り、ビューをサポートするレイヤーはバッファリングする必要があります。私はそのようなビューをレイヤーでたくさん持っており、すべてにたくさんの派手なCGのもの(パスの描画と塗りつぶし、画像のクリッピング、色付けなど)があり、パフォーマンスは素晴らしいです。

異なるパス(おそらく、視覚的にタッチを表す)がある場合は、別のビューを使用することを検討することをお勧めします。これ自体は変更されません。または、事前にレンダリングされた単一のビューでビューアニメーションを使用することを検討してください。

これがどれも目標に達しない場合は、あなたがやろうとしていることを私たちが理解するのに役立つ詳細情報を投稿してください。

于 2009-02-02T22:10:14.280 に答える
0

あなたの編集から、ある種の描画アプリをやっているように見えます.

その場合、「不明」の提案を試してみます(背景画像をパスとは別のレイヤー/ビューに配置します)。実際、とにかくそうします。CGPath を使用していますか? そうでない場合は、おそらくそれも行う価値があります。

それでも問題が解決しない場合は、現在の「編集」(すばやく連続して描画された線) を独自のパス (独自のレイヤー/ビュー内) に分離し、適切なパスの後にメイン パスに追加することをお勧めします。アイドル期間 (タイマーを使用)。

于 2009-02-05T14:18:03.777 に答える