为啥这个 CATiledLayer/PDF 代码很慢?

Posted

技术标签:

【中文标题】为啥这个 CATiledLayer/PDF 代码很慢?【英文标题】:Why is this CATiledLayer/PDF code slow?为什么这个 CATiledLayer/PDF 代码很慢? 【发布时间】:2011-03-27 09:58:18 【问题描述】:

代码如下:

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

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

它有效。但在我的 iPhone4 上速度很慢,绘制第一页大约需要三秒钟,在我的 iPod Touch 上更慢。我可以看到它绘制单个瓷砖。同样的 PDF 已经打开得更快了,没有可见的平铺绘图,在我的备用 CATiledLayer 实现中,它只使用单个 CATiledLayer/UIScrollView 和触摸事件来更改页面。我想用这个PhotoScroller 技术,很不错。

我用 Instruments 中的 CPU Sampler 看的,貌似不是 PDF 渲染代码,好像时间都花在了线程和消息传递上。如果有人可以帮助指出此示例正在做什么以产生开销,我将不胜感激。

谢谢,

吉姆


更新1:我最初使用了定义示例代码中的TilingView类技术

+ (Class) layerClass 
  return [CATiledLayer class];

然后绘制- (void)drawRect:(CGRect)rect,但切换到显式CATiledLayer 子类作为第一次尝试看看它是否会有所作为,但它没有,所以我将代码原样留在这里发布。 TilingView 中还缺少[tiledLayer release]; 泄漏。

【问题讨论】:

您找到解决方案了吗?我也在做同样的事情。 是的,增加磁贴大小会显着提高性能。 知道了,只是在代码中增加了一行:tiledLayer.tileSize = CGSizeMake(512, 512);工作得很好!谢谢。 【参考方案1】:

有关 PDF 渲染技巧,请参阅此线程 Fast and Lean PDF Viewer for iPhone / iPad / ios - tips and hints?。

【讨论】:

感谢该死的很难找到。【参考方案2】:

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

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

干杯

【讨论】:

郑,感谢您的回复。在我的计算机上,代码使用最新的 iOS 4.0.2 SDK 构建和运行。就 PDF 文件的内容而言,不幸的是,我无法选择我的用户决定尝试查看的 PDF,我必须尽力使用任何有效的 PDF 文档。【参考方案3】:

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

更新:我自己刚刚经历了这个,PhotoScroller 示例存在一些逻辑问题,使其非常缓慢。基本上,它以 1/zoomScale 渲染每个图块,然后比例返回到 zoomScale。因此,如果缩放为 0.5,它会以 2x 呈现,然后将其缩小到 0.5x。非常慢,效率低。

【讨论】:

同意,CATiledLayer 应该会为您解决这个问题,对吧?根据我们设置的属性,如果有一些诊断输出,甚至是该类的委托 API 来让我们知道缓存的行为方式,那就太好了:瓦片大小、细节、细节偏差。我想他们需要空间来调整算法。

以上是关于为啥这个 CATiledLayer/PDF 代码很慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 CoreGraphics 绘制代码很慢?

为啥顺序在这个链式分配中很重要?

为啥用析取范式表达代码很重要?

为啥这个运动检测代码不起作用?

为啥这个 OpenGL ES 代码在 iPhone 上运行缓慢?

为啥这个python中最大的主要因素的代码不能正常工作