我正在尝试了解CATiledLayer
在使用CGContextDrawPDFPage()
呈现PDF页面时的工作原理。
我的理解是每个图块和细节级别调用drawLayer:inContext:
一次。这是对的吗?
在我的平铺图层的委托中,我致电CGContextDrawPDFPage().
但是我注意到(通过将日志放入drawLayer:inContext:
),如果我将平铺图层的图块尺寸设置得更小,drawLayer:inContext:
会更频繁地调用{{1}}。
这让我想知道:
答案 0 :(得分:2)
我注意到,如果我将平铺图层的图块尺寸缩小,
drawLayer:inContext:
会被更频繁地调用。
是的,当然。假设您的图层大小相同,那么如果您告诉它使用较小的图块,则需要更多图块来覆盖该区域。
我的PDF页面是否被绘制/渲染了几次?
由于你每个瓷砖调用一次CGContextDrawPDFPage(),然后是。
然而,这可能不是问题,因为:
CGContextDrawPDFPage()是否神奇地知道要绘制的页面的哪个部分?
可能,但它不需要任何魔法。
在CATiledLayer调用-drawLayer:inContext:
之前,它会将CGContext的剪辑设置为仅包含该图块的区域。 PDF绘图代码可以获取剪辑边界(通过CGContextGetClipBoundingBox
),然后选择仅渲染该矩形内的内容。
那就是说,有两点需要注意:
CGContextDrawPDFPage()
是一个黑盒子,因此实际上可能不会进行优化。这似乎是显而易见的,但你必须检查性能数字,看它是否真的发生了。CGContextDrawPDFPage
时,您可能仍会产生一些费用 - 这实际上取决于CG的智能程度,以及它是否在内部缓存内容。渲染PDF页面时,CATiledLayer不会浪费资源吗?它的优势是什么?
CATiledLayer的优势主要在于节省内存:呈现内容的位图非常大,因此只需渲染并保留屏幕上当前可见的内容即可。它还提供了一种机制,用于缓存最近可见或可能很快再次可见的区域,具体取决于用户如何缩放和滚动。
权衡是:你必须将你的绘图分成每个拼贴的单独调用,你可能需要比你原来更频繁地渲染到拼贴中。
根据视图的大小,放大/缩小的距离,PDF的绘制成本以及应用程序中发生的其他情况,使用CATiledLayer可能没有意义,也可能没有。由你决定性能数字并决定。
答案 1 :(得分:1)
因为Ogres ...... Ahem,PDF就像洋葱。 QuartzCore是基于PDF渲染方法的 Heavily (以至于它的早期文档甚至提到了这个事实),而且CATiledLayer使用特定的“平铺”渲染方法,该方法指定了要重复绘制的对象。因此,当移动或更新磁贴或其他任何内容时,该层需要更多数据,因此在一个或多个后台线程中调用drawLayer:inContext:。
CATiledLayers也非常高效,因为它们大量使用缓存并且只加载可见层。