大规模的CATiledLayer工件

时间:2012-10-19 17:23:48

标签: cocoa catiledlayer

我正在使用CATiledLayer来绘制地图图块,当它放大时,我开始看到一些工件,我想这是由精度问题引起的。

我将CATiledLayer扩展到2 ^ 18(262'144x),工件开始出现在大约15'000x

我认为CoreAnimation足够聪明,可以处理那些大规模,但显然不是。

在我从头开始编写我的tile引擎实现之前,我想知道你是否有任何建议。

这是我设置图层的方式:

self.tiledLayer.tileSize = CGSizeMake(256, 256);
self.tiledLayer.levelsOfDetail = 1;
self.tiledLayer.levelsOfDetailBias = 10000;

我的例子,绘图代码非常简单:

- (void)drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)context
{
    CGRect rect = CGContextGetClipBoundingBox(context);
    CGContextSetFillColorWithColor(context, [NSColor colorWithCalibratedRed:((CGFloat)rand() / (CGFloat)RAND_MAX) green:((CGFloat)rand() / (CGFloat)RAND_MAX) blue:0 alpha:1].CGColor);
    CGContextFillRect(context, rect);
}

这就是我在图层上设置比例的方法:

CGAffineTransform t = CGAffineTransformIdentity;

CGFloat scale = pow(2, self.zoomLevel); // self.zoomLevel ranges from 0 to 18
t = CGAffineTransformScale(t, scale, scale);

NSLog(@"%g", scale);

self.tiledLayer.affineTransform = t;

注意:我发现工件只出现在图层的“远离原点”。如果我看到原点附近的瓷砖,它们不会变形,如果我远离原点(截图来自中心)它会变得更糟。

以下是我看到的工件示例:

artefacts

1 个答案:

答案 0 :(得分:0)

好的,我只是在烹饪时找到了一个非常简单的解决方案,只需将比例模数为合理的值并循环显示绘图代码。因此,例如当比例达到64时,将其重置为1并给出绘图代码64,因此当比例为2时,绘图代码将选择切片的切片为128.

我明天会尝试这个,看看我如何使用CATiledLayer缓存机制来确保顺畅的体验。

编辑:我只花了几分钟尝试这种方法,但我实际上遇到了缓存问题,因为当我将比例设置回预览值时,不再调用drawInContext 。我尝试调用setNeedsDisplay,但它会破坏缩放的平滑度并使一切变得非常慢。

编辑2:在修补此解决方案几个小时之后,我无法顺利进行缩放和平移。我尝试了一种简单的方法,在一个NSView drawRect:中绘制我的瓷砖,它可以工作,但需要大量的工作才能平滑而快速。所以我保持这个问题的建议。

编辑3:我终于从零开始编写了自己的实现,没有这个错误。