Quartz 2D を使用して、シンプルなマルチタッチ描画 iPad ゲームを作成しています。このゲームでは、1/30 秒ごとに指の位置で新しいストロークを描く必要があります。
私の知る限り、 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 で実行される速度が大幅に低下することに気付きました。おそらく、Retina ディスプレイが大きいためでしょう。作成した別の CGBitmapContext を使用し、反復ごとにそれから ImageRef を作成し、CGContextDrawImage でペイントすると、同じ問題が発生します。
これに対処するには、どのようなアプローチを取ることができますか? 変更されたものの drawRect に小さな長方形を渡すだけでは十分ではないため、反復ごとにすべてを再描画する必要があるようです (反復ごとに指ごとにいくつかの長方形が必要になるため)
ありがとうございました