1

我试图了解CATiledLayer使用CGContextDrawPDFPage().

我的理解是,drawLayer:inContext:每个图块和细节级别调用一次。那是对的吗?

在我的平铺层的代表中,我调用了CGContextDrawPDFPage(). 但是我注意到(通过将日志放入 中drawLayer:inContext:drawLayer:inContext:如果我使平铺层的平铺尺寸更小,则调用的频率更高。这让我想知道:

  • 我的 PDF 页面是否被绘制/渲染了 x 次?
  • 还是 CGContextDrawPDFPage() 神奇地知道要绘制页面的哪个部分?
  • 渲染PDF页面时,CATiledLayer是不是很浪费资源?它的优势是什么?
4

2 回答 2

2

我注意到drawLayer:inContext:如果我将平铺层的平铺尺寸变小,它会更频繁地被调用。

是的当然。假设您的图层大小相同,那么如果您告诉它使用较小的图块,它将需要更多的图块来覆盖该区域。

我的 PDF 页面是否被绘制/渲染了 x 次?

由于您对每个图块调用一次 CGContextDrawPDFPage() ,因此可以。

但是,这可能不是问题,因为:

CGContextDrawPDFPage() 是否神奇地知道要绘制页面的哪个部分?

它可能,但它不需要任何魔法。

在 CATiledLayer 调用之前-drawLayer:inContext:,它将 CGContext 的剪辑设置为仅包含该图块的区域。PDF 绘图代码可以获取剪辑边界(通过CGContextGetClipBoundingBox),然后选择仅呈现该矩形内的内容。

也就是说,有两个警告:

  1. CGContextDrawPDFPage()是一个黑匣子,所以它实际上可能不会做那个优化。这似乎很明显,但您必须检查性能数据以查看它是否真的发生了。
  2. 解析和布局 PDF 内容仍有相当大的开销。您可能仍然会在每次调用时产生一些成本CGContextDrawPDFPage——这实际上取决于 CG 的智能程度,以及它是否在内部缓存内容。

渲染PDF页面时,CATiledLayer是不是很浪费资源?它的优势是什么?

CATiledLayer 的优势主要在于节省内存:存储渲染内容的位图非常大,因此仅渲染和保留当前在屏幕上可见的内容是值得的。它还提供了一种机制,用于缓存最近可见或可能很快再次可见的区域,具体取决于用户缩放和滚动的方式。

权衡是:您必须将您的绘图分离到每个图块的单独调用中,并且您可能需要比其他方式更频繁地渲染到图块中。

根据视图的大小、放大/缩小的程度、绘制 PDF 的成本以及应用程序中发生的其他情况,使用 CATiledLayer 可能有意义,也可能没有意义。您可以查看性能数据并做出决定。

于 2012-05-13T20:14:41.943 回答
1

因为食人魔......啊哼,PDF就像洋葱。QuartzCore 大量基于PDF 渲染方法(以至于它的早期文档甚至提到了这一事实),并且 CATiledLayer 使用特定的“平铺”渲染方法,该方法指定要重复绘制的对象。因此,当图块被移动或更新或其他任何事情时,图层需要更多数据,因此在一个或多个后台线程中调用 drawLayer:inContext:。

CATiledLayers 也非常高效,因为它们大量使用缓存并且只加载可见层。

于 2012-05-13T19:57:13.913 回答