我正在通过 drawInContext() 在 CALayer 子类中渲染一个简单的线条图(中间有一些文本的线条)。当用户通过调用 setNeedsDisplay 来执行手势时,我会更新该层。如果没有进行双缓冲,我所看到的效果就是我所期望的......即我看到新渲染的部分与旧渲染的部分重叠。当我停止更新(完成手势)时,系统“赶上”并且我总是看到正确的最终结果,但在更新期间我看到不一致的结果......这种效果并不微妙,有时它是极端的......例如,如果我保持更新速度足够快,我可以在新部分提前 绘制时将绘图的陈旧部分保持在屏幕上几秒钟......
我完全不明白这一点。如果 Quartz 正在进行缓冲,那么它似乎没有将结果整体传送到屏幕上,或者它错误地计算了受影响的区域。
我尝试过的事情:
1) 我正在禁用隐式动画并在 CATransaction 中进行所有绘图
2)我没有在我的绘图中犯错误......实际上只是两行,中间有一些文字......我无法渲染中间工件。
3)我尝试通过跳过大部分更新来限制更新速率......但即使在较低的速率下,我也会看到工件,直到我停止更新并让系统赶上。
4)顺便说一句,这在模拟器和设备(iPad)上发生的情况相同。
我是否有必要自己绘制到屏幕外缓冲区并将其完整地复制到屏幕上?我以为我已经读过 Quartz 为我做了这个。
更新: 像往常一样,经过数小时的头撞墙后,我在发布问题 5 分钟后找到了(部分)答案。我意识到我正在使用 CATiledLayer 来让我的图层在缩放时重新渲染。如果我将它切换回常规的 CALayer,故障就会消失。所以我猜我看到了单独的瓷砖渲染的伪影。现在我正在想办法解决这个问题......