2

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

我完全不明白这一点。如果 Quartz 正在进行缓冲,那么它似乎没有将结果整体传送到屏幕上,或者它错误地计算了受影响的区域。

我尝试过的事情:

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

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

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

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

我是否有必要自己绘制到屏幕外缓冲区并将其完整地复制到屏幕上?我以为我已经读过 Quartz 为我做了这个。

更新: 像往常一样,经过数小时的头撞墙后,我在发布问题 5 分钟后找到了(部分)答案。我意识到我正在使用 CATiledLayer 来让我的图层在缩放时重新渲染。如果我将它切换回常规的 CALayer,故障就会消失。所以我猜我看到了单独的瓷砖渲染的伪影。现在我正在想办法解决这个问题......

4

1 回答 1

0

所以,事实证明我遇到了三个问题:

1) CATiledLayer 以 0.25 秒的默认时间显式淡入新的平铺内容......这对我的绘图造成了严重破坏。我在我的 CATiledLayer 子类中覆盖了它:

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

2)我还必须调整最大瓷砖尺寸(我将其设置为 1024x1024,尽管我不知道它实际使用的尺寸)。

3)我在更新期间定期调整我的图层框架,这似乎给平铺图层带来了额外的问题。我正在做出改变来阻止这种情况。

有了所有这些变化,现在的性能似乎可以接受。

于 2010-08-09T00:51:27.113 回答