如果与CGContextSetShadowWithColor一起使用,UIBezierPath会降低性能

时间:2012-01-09 16:59:14

标签: objective-c core-graphics drawrect cgcontext uibezierpath

我正在开发一个应用程序,用户可以通过手指触摸或简单地喷涂颜色来绘制线条。 我正在使用UIBezierPath在drawRect方法中用手指触摸绘制路径(颜色),并使用以下代码。

CGContextRef context = UIGraphicsGetCurrentContext();

for (BezierPath *path in paths)
{
    path.path.lineWidth = [DataController dataController].apertureRadius * 2;
    path.path.lineJoinStyle = kCGLineJoinRound;
    path.path.lineCapStyle = kCGLineCapRound;
    ///
    [path.color set];
    CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 20, [path.color CGColor]);//Problem
    //

    [path.path stroke];
}

此代码在模拟器上运行良好但在设备上喷雾非常慢。 并且问题仅在于方法调用CGContextSetShadowWithColor,如果我评论此行性能最好没有任何问题。

请建议我为什么会这样,我该怎么办。 这条线是必要的,因为我想用模糊阴影来显示喷雾效果。

1 个答案:

答案 0 :(得分:1)

画一个阴影可能很慢。系统必须绘制到屏幕外缓冲区的路径,计算离屏缓冲区的alpha通道的高斯模糊到另一个屏幕外缓冲区,然后将两个屏幕外缓冲区合成到原始图形上下文。

我怀疑每次触摸更新时,您都会重新绘制触摸所遵循的整个路径。您需要在每个帧上尽可能少地绘制。

保留您自己的位图上下文(使用CGBitmapContextCreateUIGraphicsBeginImageContextWithOptions创建)。借鉴这个私人背景。当您触摸移动事件时,仅从触摸的旧位置绘制笔划到新位置。然后从位图上下文中获取图像(使用CGBitmapContextCreateImageUIGraphicsGetImageFromCurrentImageContext)并将其设置为视图的图像或图层的内容。