CATiledLayerを使用してマップタイルを描画していますが、ズームすると、精度の問題が原因であると思われるアーティファクトがいくつか表示され始めます。
CATiledLayerを2^18(262'144x)までスケールすると、アーティファクトが約15'000xで表示され始めます。
CoreAnimationは、これらの大規模なものを処理するのに十分スマートだと思いましたが、明らかにそうではありません。
これを処理するためにタイルエンジンの実装を最初から書き始める前に、何か提案があるかどうか疑問に思いました。
これが私のレイヤーのセットアップ方法です:
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;
注:アーティファクトはレイヤーの「原点から遠く」にしか表示されないことを発見しました。原点の近くでタイルを見ると、変形していません。原点から遠くで見ると(中央からの場合はスクリーンショット)、悪化します。
これが私が見るアーティファクトの例です: