我正在使用 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;
注意:我发现工件只出现在图层的“远离原点”。如果我看原点附近的瓷砖,它们不会变形,如果我看远离原点(如果从中心截屏)它会变得更糟。
这是我看到的工件的示例: