我正在开发一个应用程序,用户可以通过手指触摸或简单地喷涂颜色来绘制线条。 我正在使用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,如果我评论此行性能最好没有任何问题。
请建议我为什么会这样,我该怎么办。 这条线是必要的,因为我想用模糊阴影来显示喷雾效果。
答案 0 :(得分:1)
画一个阴影可能很慢。系统必须绘制到屏幕外缓冲区的路径,计算离屏缓冲区的alpha通道的高斯模糊到另一个屏幕外缓冲区,然后将两个屏幕外缓冲区合成到原始图形上下文。
我怀疑每次触摸更新时,您都会重新绘制触摸所遵循的整个路径。您需要在每个帧上尽可能少地绘制。
保留您自己的位图上下文(使用CGBitmapContextCreate
或UIGraphicsBeginImageContextWithOptions
创建)。借鉴这个私人背景。当您触摸移动事件时,仅从触摸的旧位置绘制笔划到新位置。然后从位图上下文中获取图像(使用CGBitmapContextCreateImage
或UIGraphicsGetImageFromCurrentImageContext
)并将其设置为视图的图像或图层的内容。