私は単純なマルチタッチ描画のiPadゲームを作成するためにQuartz 2Dを使用しています。このゲームでは、1/30秒ごとに指の位置に新しいストロークを描く必要があります。iOSのシンプルなマルチタッチ描画アプリケーション:余りにも遅い(drawRect()が加法的でないため)
私が知る限り、drawRect()は、呼び出されるたびにコンテキストをクリアしないようにする方法は基本的にありません(self.clearsContextBeforeDrawing = NO;動作しません)ので、私の解決策はバックバッファビットマップ(またはレイヤー、私は両方を使用することができます)は、各新しいストロークをそのバックバッファに各指ごとに描画し、drawRect()を呼び出すたびにバッファを画面にコピーします。言い換えれば:
backlayer = CGLayerCreateWithContext(context, CGSizeMake(W, H), NULL);
offctx = CGLayerGetContext (backlayer);
、その後
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
//code here to draw small strokes from old finger position to new one
CGContextDrawLayerInRect(context, [self bounds], backlayer);
}
私は私のiPad 2上でテストしていた間、これは問題なく働いたが、昨日、私はこれと同じコードが新しいiPad 3にはるかに遅く走ることに気づきました。パフォーマンスは、30FPSから約5倍にまで、ゲームの速度を落としてしまいます。これはおそらく、より大きな網膜ディスプレイのためです。別のCGBitmapContextを使用して作成した場合と、それからImageRefを作成してCGContextDrawImageを使用してペイントするたびに、同じ問題が発生します。
これに対処するにはどのような方法がありますか?それは、それがさらに変更されたものののdrawRectに小さなrectangeを渡すために十分ではありませんので、私はすべての繰り返し、すべてを再描画する必要がありますように思える
はあなたに
なぜサークルを再描画する必要があると感じますか?サークルを含むレイヤーやビューを作成し、必要に応じてアニメーションや位置を変更してみましょう。これは、非常に高価な再描画操作を回避します。 –
私は理解しているとは思わない。私のサークルはすべて、時間枠ごとに異なって見えます。それらが異なる色またはサイズでなければならないと仮定します。同じパターンを別の場所にコピーすることはできません。また、私は最終的に数千のオーダーで、おそらく多くのサークルを持つ必要があります。言い換えれば、純粋に相加的なキャンバスを何らかの方法で表示する方法が必要です。 – karpathy
ユニークな円を描き、互いにオーバーレイさせる必要がある場合は、各サークルを独自のCALayerまたはUIViewに描画し、これらのレイヤーを重ねて配置して全体のシーンを作成します。そうすれば、各サークルを一度描くだけで済みますし、合成後に残りの部分を処理します。合成はCore Graphicsの描画よりはるかに高速です。特定の点を超えて、背景の円をまとめてメモリに保存することもできますが、もう一度そのラスタライズを行い、その上に新しいサークルを重ねる必要があります。 –