我注意到drawLayer:inContext:
如果我将平铺层的平铺尺寸变小,它会更频繁地被调用。
是的当然。假设您的图层大小相同,那么如果您告诉它使用较小的图块,它将需要更多的图块来覆盖该区域。
我的 PDF 页面是否被绘制/渲染了 x 次?
由于您对每个图块调用一次 CGContextDrawPDFPage() ,因此可以。
但是,这可能不是问题,因为:
CGContextDrawPDFPage() 是否神奇地知道要绘制页面的哪个部分?
它可能,但它不需要任何魔法。
在 CATiledLayer 调用之前-drawLayer:inContext:
,它将 CGContext 的剪辑设置为仅包含该图块的区域。PDF 绘图代码可以获取剪辑边界(通过CGContextGetClipBoundingBox
),然后选择仅呈现该矩形内的内容。
也就是说,有两个警告:
CGContextDrawPDFPage()
是一个黑匣子,所以它实际上可能不会做那个优化。这似乎很明显,但您必须检查性能数据以查看它是否真的发生了。
- 解析和布局 PDF 内容仍有相当大的开销。您可能仍然会在每次调用时产生一些成本
CGContextDrawPDFPage
——这实际上取决于 CG 的智能程度,以及它是否在内部缓存内容。
渲染PDF页面时,CATiledLayer是不是很浪费资源?它的优势是什么?
CATiledLayer 的优势主要在于节省内存:存储渲染内容的位图非常大,因此仅渲染和保留当前在屏幕上可见的内容是值得的。它还提供了一种机制,用于缓存最近可见或可能很快再次可见的区域,具体取决于用户缩放和滚动的方式。
权衡是:您必须将您的绘图分离到每个图块的单独调用中,并且您可能需要比其他方式更频繁地渲染到图块中。
根据视图的大小、放大/缩小的程度、绘制 PDF 的成本以及应用程序中发生的其他情况,使用 CATiledLayer 可能有意义,也可能没有意义。您可以查看性能数据并做出决定。