【问题标题】:UIBezierPath slow performance if used along with CGContextSetShadowWithColor如果与 CGContextSetShadowWithColor 一起使用,UIBezierPath 会降低性能
【发布时间】:2012-01-09 16:59:14
【问题描述】:

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

CGContextRef 上下文 = 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,如果我评论这条线性能最好,完全没有问题。

请告诉我为什么会这样以及我应该怎么做。 这条线是必要的,因为我想用模糊阴影显示类似喷雾的效果。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-05
      • 2016-02-25
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2015-07-01
      • 2018-12-12
      • 1970-01-01
      相关资源
      最近更新 更多