CATiledLayer基础知识:为什么CATiledLayer的drawLayer:inContext:在渲染PDF时经常调用?

时间:2012-05-13 19:39:07

标签: objective-c ios core-graphics catiledlayer

我正在尝试了解CATiledLayer在使用CGContextDrawPDFPage()呈现PDF页面时的工作原理。

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

在我的平铺图层的委托中,我致电CGContextDrawPDFPage(). 但是我注意到(通过将日志放入drawLayer:inContext:),如果我将平铺图层的图块尺寸设置得更小,drawLayer:inContext:会更频繁地调用{{1}}。 这让我想知道:

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

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

由于你每个瓷砖调用一次CGContextDrawPDFPage(),然后是。

然而,这可能不是问题,因为:

  

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

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

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

那就是说,有两点需要注意:

  1. CGContextDrawPDFPage()是一个黑盒子,因此实际上可能不会进行优化。这似乎是显而易见的,但你必须检查性能数字,看它是否真的发生了。
  2. 解析和布局PDF内容仍然存在相当大的开销。每次调用CGContextDrawPDFPage时,您可能仍会产生一些费用 - 这实际上取决于CG的智能程度,以及它是否在内部缓存内容。
  3.   

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

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

    权衡是:你必须将你的绘图分成每个拼贴的单独调用,你可能需要比你原来更频繁地渲染到拼贴中。

    根据视图的大小,放大/缩小的距离,PDF的绘制成本以及应用程序中发生的其他情况,使用CATiledLayer可能没有意义,也可能没有。由你决定性能数字并决定。

答案 1 :(得分:1)

因为Ogres ...... Ahem,PDF就像洋葱。 QuartzCore是基于PDF渲染方法的 Heavily (以至于它的早期文档甚至提到了这个事实),而且CATiledLayer使用特定的“平铺”渲染方法,该方法指定了要重复绘制的对象。因此,当移动或更新磁贴或其他任何内容时,该层需要更多数据,因此在一个或多个后台线程中调用drawLayer:inContext:。

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