iOS重复调用CGContext.save/restoreGState(又名CGContextSave / RestoreGState)导致锯齿状

时间:2016-10-17 06:50:54

标签: ios swift core-graphics uigraphicscontext

经过多次实验后,我发现在重复调用saveGState()restoreGState之后在上下文中绘制图像会导致锯齿状。

这是我在iOS 8,9和10中观察到的。所以我不认为它与任何一个iOS版本相关。

UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0.0)
let ctx = UIGraphicsGetCurrentContext()

for i in 0 ... count {
    ctx?.saveGState()

    // Some clipping done
    image.draw(in: self.bounds)

    values.append(animImage)
    ctx?.restoreGState()
}

UIGraphicsEndImageContext()

上面的代码是我所做的简化版本。 我实际上需要循环count次来剪辑image的各个部分,并发现锯齿状。

打电话2到3次似乎没问题 - 也许吧。我没有做过并排比较 - 但大约10次,肯定会发生。

以下是图片:

Jaggies No Jaggies

我能够通过将UIGraphicsBeginImageContextWithOptions移动到循环中来解决问题,但我对性能不太了解。

质量下降是预期的问题还是一个微妙的错误? 此外,与调用save/restoreGState()相比,为每次迭代开始新上下文(如果有)会对性能产生什么影响?

(我只是问,因为我可能没有足够的时间来测试,但这并不重要)

1 个答案:

答案 0 :(得分:2)

您需要在再次绘制之前删除上一个图形。看起来您在旧图层上添加了新图层,这使得抗锯齿看起来清晰且锯齿状,因为每次都会建立边缘像素的不透明度。

这就是UIGraphicsBeginContextWithOptions正在为你做的事情,正如你在评论中所说的,它每次给你一个干净的名单。

因此,您发现添加ctx?.clear(self.bounds)可以解决问题。