2011-08-05 7 views
9

MKMapOverlayView用に作成したCGContextにCG描画操作を実行しています。コンテキストに描画した後、イメージを作成し、MapKitが提供したコンテキストに貼り付けます。CGContextを別のCGContextにコピーする

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { 
    CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef myContext = CGBitmapContextCreate(NULL, kTileSize, kTileSize, 8, 0, colorRef, kCGImageAlphaPremultipliedLast); 
    CGColorSpaceRelease(colorRef); 
    CGContextSetAllowsAntialiasing(myContext, TRUE); 
    //...cut out drawing operations... 
    CGImageRef image = CGBitmapContextCreateImage(myContext); 
    CGContextDrawImage(context, [self rectForMapRect:mapRect], image); 
    CGImageRelease(image); 
    CGContextRelease(myContext); 
} 

画像を生成することなく、単にcontextmyContextをコピーする方法はありますか?

私は、「MapKitが提供するコンテキストに直接描画するのはなぜ」と言う人もいると思います。残念ながら、contextに直接描画すると描画グリッチが発生します。 Appleは現在この問題を調査中ですが、その間に回避策を講ずる必要があります。私が上に示したこの回避策は私の「ベスト」ショットですが、それは少し遅いです。

P.S.私はここでも答えを探しているので、私は賞金を始めました。具体的には、OS Xをターゲットにしているので、答えはそこで動作するはずです。 OPはiOSで答えを探していました。

+0

問題の適切な解決策を見つけましたか?私は今、同じ問題に直面しています... – Georg

+0

残念ながら、「CGFloat」は64ビットのiOSデバイスでは「ダブル」であるにもかかわらず、大きな整数と大きな部分はまだ十分なジッタを導入しますマップタイルには非常に小さな変更がレンダリングされます。 –

答えて

1

CGLayerRefを使用できます。レイヤーrefは、あなたがたくさんの描画を行うサブコンテキストのようなもので、レイヤーの価値のあるコンテンツを描画し終えると元のコンテキストにフラットダウンします。

一般に、個々の呼び出しではなく、多くの描画呼び出しで共有されるアルファまたはシャドウを取得するために使用されます。

どのようなバグが発生したとしても、2つのコンテキストアプローチよりもパフォーマンスが優れているか悪いのかはまだ解決しているかどうかはわかりません。私はあなたの目標と要件についてもっと知る必要があります。たとえば、2つ目のコピーを避けるために2つのコンテキストを使用しないようにしたいのですか、または2つ目のイメージにメモリを支払う必要がないためですか?