10

MKMapOverlayView 用に作成した CGContext に対して、いくつかの CG 描画操作を実行しています。コンテキストに描画した後、画像を作成し、MapKit が提供するコンテキストに貼り付けます。

- (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);
}

イメージを作成せずに単純にコピーする方法はありmyContextますか?context

「MapKit が提供するコンテキストに直接描画してみませんか」という方もいらっしゃると思います。残念ながら、context直接レンダリングするときに描画の不具合が発生しています。Apple は現在この問題を調査していますが、それまでの間、回避策を講じる必要があります。上に示したこの回避策は、私の「ベスト」ショットですが、少し遅いです。

PSここでも答えを探しているので、報奨金を開始しました。具体的には、OS Xをターゲットにしています。したがって、答えはそこで機能するはずです。OPはiOSでの答えを探していました。

4

2 に答える 2

1

CGLayerRef を使用できます。レイヤー ref は、一連の描画を行うサブコンテキストのようなものであり、レイヤーに相当するコンテンツの描画が完了すると、元のコンテキストにフラット化されます。

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

遭遇したバグが何であれ、これが回避策になるかどうか、またはパフォーマンスが 2 つのコンテキストのアプローチよりも優れているかどうかはわかりません。お客様の目標と要件について詳しく知る必要があります。たとえば、2 番目のコピーを避けるために 2 つのコンテキストを使用することを避けたいですか、それとも 2 番目のイメージにメモリを使用したくないためですか?

于 2016-05-25T06:58:43.650 に答える