为什么这个CATiledLayer / PDF代码速度慢?

时间:2010-08-09 16:50:10

标签: iphone performance pdf catiledlayer

以下是代码:

https://www.dropbox.com/s/o42wy36x4qhrbpt/PDFScroller.zip

我使用WWDC 2010 PhotoScroller示例代码实现嵌套UIScrollViews进行缩放,在UIScrollView内进行分页,并换出我认为所需的最少量代码显示多页PDF而不是图像。

有效。但是我的iPhone4上的速度很慢,第一页画的时间大约是三秒钟,而我的iPod Touch则更慢。我可以看它画个别瓷砖。同样的PDF已经更快地打开,没有可见的平铺图,在我使用的另一个CATiledLayer实现中,它只使用单个CATiledLayer / UIScrollView并触摸事件来更改页面。我想使用这种PhotoScroller技术,非常好。

我用仪器中的CPU Sampler观察它,它似乎不是PDF渲染代码,看起来时间在线程和消息传递中占用。如果有人可以帮助指出这个样本正在做什么来产生开销,我会很感激。

谢谢,

吉姆


更新1:我最初使用了定义

示例代码中的TilingView类技术
+ (Class) layerClass {
  return [CATiledLayer class];
}

然后绘制- (void)drawRect:(CGRect)rect,但切换到显式CATiledLayer子类,作为第一次尝试看它是否会产生影响,但事实并非如此,所以我将代码保留为原样在这里张贴TilingView中还缺少[tiledLayer release];泄漏。

3 个答案:

答案 0 :(得分:4)

有关PDF渲染提示,请参阅此主题Fast and Lean PDF Viewer for iPhone / iPad / iOs - tips and hints?

答案 1 :(得分:2)

因为你的代码包含几个错误,我无法编译代码,但我看了一下存档中包含的PDF文件,我知道你的TilingView速度慢的原因。

通常,当您使用方法CGContext:在CGContextDrawPDFPage中绘制pdf页面时,所有文本和矢量图形都会被渲染,而PDF中的普通图形等其他内容只会被绘制和缓存。所以PDF文件有多大并不重要,但如果你的PDF中有矢量grahics,那就无所谓了。看来你的PDF中有一些矢量图形,还有一些数学方程式,这就是为什么它很慢的原因。我建议你尝试使用另一个不包含矢量图形的PDF文件,看它是否更快。

干杯

答案 2 :(得分:1)

猜测不得以任何形式授权:PDF 大多数文档的基于矢量的格式(不包括那些仅用作嵌入式TIFF图像容器的格式)。因此,当您像PhotoScroller一样平铺PDF时,您基本上要求手机为每个单独的图块缩放和栅格化整个PDF(至少是给定页面)。因此,不是像对一个CATiledLayer那样绘制一次,而是为每个分辨率多次绘制它。由于PDF本身就是一种可扩展的格式,因此您应该能够为每个页面/比例简单地渲染整个视图。

更新:我自己完成了这项工作,PhotoScroller示例存在一些逻辑问题,导致速度非常慢。基本上它将每个图块渲染为1 / zoomScale,然后缩放比例缩小为zoomScale。因此,如果缩放位于.5,则渲染为 2x ,然后将其缩小至0.5x。效率很慢。