0

我正在使用 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;

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

这是我看到的工件的示例:

人工制品

4

1 回答 1

0

好的,我刚刚在烹饪时找到了一个非常简单的解决方案,只需将比例取模为合理的值,然后循环并提示绘图代码。因此,例如,当比例达到 64 时,将其重置为 1 并将 64 分配给绘图代码,因此当比例为 2 时,绘图代码将在 128 处选择用于缩放的图块。

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

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

编辑 2:在修改了这个解决方案几个小时后,我无法获得平滑的缩放和平移。我尝试了一种简单的方法,在单个 NSView drawRect: 中绘制我的图块,它可以工作,但需要大量工作才能平滑和快速。所以我对这个问题持开放态度。

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

于 2012-10-19T17:41:54.483 回答