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

有没有一种方法可以简单地复制myContextcontext无需创建图像?

我意识到你们中的一些人会说“为什么不直接绘制到 MapKit 提供的上下文中”。不幸的是,我们在context直接渲染时遇到了绘图故障。Apple 目前正在为我们调查此问题,但与此同时,我们需要找到解决方法。我在上面介绍的这个解决方法是我的“最佳”镜头,但它有点慢。

PS我已经开始赏金,因为我也在在这里寻找答案。具体来说,我的目标是 OS X。所以答案应该在那里工作。OP 正在寻找 iOS 上的答案。

4

2 回答 2

1

您可以使用 CGLayerRef。layer ref 就像子上下文,您在其中进行大量绘图,然后在绘制完该层的内容时将其展平到原始上下文中。

它通常用于在许多绘图调用而不是每个单独的调用中获取共享的 alpha 或阴影。

我不知道这是否仍然可以解决您遇到的任何错误,或者性能是否比两种上下文方法更好或更差。我需要更多地了解您的目标和要求。例如,您是要避免使用两个上下文来避免第二个副本,还是因为您不想为第二个图像支付内存?

于 2016-05-25T06:58:43.650 回答
0

只有在使用 CGBitmapContextCreateImage 时修改了位图图形上下文中的基础数据时,才会发生位的实际物理副本,因此从 CGBitmapContext 创建图像时不会有太多的性能损失。

于 2019-01-29T03:05:41.407 回答