iphone – 在CATiledLayer上有效地绘制CGPath

如何在CATiledLayer上有效地绘制CGPath?我正在检查磁贴的边界框是否与路径的边界框相交,如下所示:

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context {
    CGRect boundingBox = CGPathGetPathBoundingBox(drawPath);
    CGRect rect = CGContextGetClipBoundingBox(context);

    if( !CGRectIntersectsRect(boundingBox, rect) )
        return;

    // Draw path...
}

这不是非常有效,因为drawLayer:inContext:从多个线程多次调用并导致多次绘制路径.

有更好,更有效的方法吗?

最简单的选择是将曲线绘制成一个大图像,然后平铺图像.但是,如果你是平铺,那可能意味着图像太大了,或者你刚刚开始绘制路径,对吧?

所以你可能需要分开你的路径.最简单的方法是使用CGPathApply逐元素拆分它.对于每个元素,您可以检查其边界框并确定该元素是否属于您的边界.如果没有,只需跟踪最后一个终点即可.如果是,则移动到您看到的最后一个结束点,并将该元素添加到此图块的新路径中.完成后,每个磁贴将绘制自己的路径.

从技术上讲,你会“画出”超出界限的东西(例如延伸到瓷砖之外的线条),但这比听起来要便宜得多. Core Graphics将非常容易地剪辑单个元素.目标是避免计算完全不在边界框中的元素.

请务必缓存生成的路径.您不需要计算每个图块的路径;只是你画的那些.但是每次瓦片绘制时都要避免重新计算.每当数据发生变化时,请转储缓存.如果有非常多的磁贴,您还可以使用NSCache来更好地优化它.

相关文章
相关标签/搜索