为什么石英双重缓冲我的drawInContext()?

时间:2010-08-08 23:55:14

标签: ipad drawing quartz-2d

我通过drawInContext()在CALayer子类中渲染一个简单的线条图(中间有一些文字的线条)。当用户通过调用setNeedsDisplay执行手势时,我更新此层。如果没有双重缓冲,我所看到的效果就是我所期望的...即我看到部分新渲染重叠了旧渲染的部分。当我停止更新(完成手势)时,系统“赶上”并且我总是看到正确的最终结果,但在更新期间我看到不一致的结果......这种效果不是微妙的,有时它是极端的......例如如果我继续快速更新,我可以在屏幕上保留图形的陈旧部分,同时新部件正在提前...

我根本不明白这一点。如果Quartz正在进行缓冲,那么它似乎并没有将结果全部暴露给屏幕,或者是计算错误的区域。

我尝试过的事情:

1)我正在禁用隐式动画并在CATransaction中执行所有绘图

2)我在绘图中没有犯错......它实际上只是两行,其间有一些文字......我无法渲染中间工件。

3)我已经尝试通过跳过大部分来限制更新速率......但即使以较低的速率,我也看到了工件,直到我停止更新并让系统赶上来。

4)顺便说一句,这种情况在模拟器和设备(iPad)上完全相同。

我是否有必要自己绘制一个屏幕外缓冲区并将其全部复制到屏幕上?我以为我读过Quartz为我做过这件事。

更新 像往常一样,经过几个小时的撞击墙头后,我发现问题后5分钟找到(部分)答案。我意识到我正在使用CATiledLayer,以便在缩放时重新渲染我的图层。如果我将它切换回普通的CALayer,毛刺就会消失。所以我猜我看到了单独的瓷砖渲染的文物。现在我想弄清楚如何处理这个......

1 个答案:

答案 0 :(得分:0)

所以,事实证明我有三个问题:

1)CATiledLayer显式淡入新的磁贴内容,默认时间为0.25秒......这对我的绘图造成了严重破坏。我在我的CATiledLayer子类中重写了这个:

+ (CFTimeInterval)fadeDuration {
    NSLog(@"got fade duration");
    return 0;
}

2)我还必须调整最大图块大小(我将其设置为1024x1024,虽然我不知道实际使用的是什么尺寸)。

3)我在更新期间定期对我的图层框架进行调整,这似乎会导致平铺图层出现其他问题。我正在做出改变以阻止它。

所有这些变化现在都可以接受。