经过多次实验后,我发现在重复调用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次,肯定会发生。
以下是图片:
我能够通过将UIGraphicsBeginImageContextWithOptions
移动到循环中来解决问题,但我对性能不太了解。
质量下降是预期的问题还是一个微妙的错误?
此外,与调用save/restoreGState()
相比,为每次迭代开始新上下文(如果有)会对性能产生什么影响?
(我只是问,因为我可能没有足够的时间来测试,但这并不重要)
答案 0 :(得分:2)
您需要在再次绘制之前删除上一个图形。看起来您在旧图层上添加了新图层,这使得抗锯齿看起来清晰且锯齿状,因为每次都会建立边缘像素的不透明度。
这就是UIGraphicsBeginContextWithOptions正在为你做的事情,正如你在评论中所说的,它每次给你一个干净的名单。
因此,您发现添加ctx?.clear(self.bounds)
可以解决问题。