2010-08-08 57 views
2

我正在通过drawInContext()在CALayer子类中渲染一个简单的线条图(中间有一些文本的一行)。我在用户通过调用setNeedsDisplay执行手势时更新此图层。我看到的效果是我可能期望的,如果没有双缓冲进行......即我看到旧渲染的部分新渲染重叠部分。当我停止更新(完成手势)系统“赶上”,我总是看到正确的最终结果,但在更新期间,我看到不一致的结果......这种影响并不微妙,有时甚至是极端的......例如,如果我保持更新速度不够快,我可以在屏幕上保留图纸的陈旧部分,同时新零件正在提前绘制...为什么Quartz不会缓冲我的drawInContext()?

我完全不理解这一点。如果Quartz正在进行缓冲,那么它看起来并没有将结果传输到整个屏幕,或者是错误地计算了受影响的区域。

事情我已经尝试:

1)我禁用隐式动画和做所有的绘图的CATransaction

2)我不会让我的画在错误的内...它字面上只是两行之间有一些文字......我没有办法渲染中间文物。

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

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

我是否需要自己绘制屏幕外缓冲区并将其全部复制到屏幕上?我以为我读过Quartz为我做的。

更新: 像往常一样,敲我的头撞在墙上的小时后我找到(部分)答案张贴问题后5分钟。我意识到我正在使用CATiledLayer来让我的图层在缩放时重新渲染。如果我将它切换回普通的CALayer,那么毛刺就会消失。所以我猜我看到了单独的瓷砖渲染的文物。现在,我试图找出如何处理这个...

+0

您可以制作一些简短的示例代码来重现问题吗? – 2010-08-09 00:01:39

回答

0

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

1)CATiledLayer在新的瓷砖内容明确地变淡0.25秒的默认时间......这对我的绘画造成了巨大的破坏。我在CATiledLayer子推翻这样的:

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

2)我也不得不调整最大切片尺寸可达(我将它设置为1024×1024,尽管我不知道它实际上是用什么尺寸)。

3)在更新过程中,我正在定期调整图层的框架,这似乎给平铺图层带来了额外的问题。我正在进行更改以阻止该问题。

随着所有这些变化的表现似乎现在可以接受。

相关问题