我试图了解 CATiledLayer
在使用 CGContextDrawPDFPage()
渲染 PDF 页面时有效.
我的理解是 drawLayer:inContext:
每个图 block 和细节级别调用一次。那是对的吗?
在我的平铺层的代表中,我调用 CGContextDrawPDFPage().
但是我注意到(通过将日志放入 drawLayer:inContext:
) drawLayer:inContext:
如果我使平铺层的平铺尺寸更小,则会更频繁地调用。
这让我想知道:
最佳答案
I noticed that
drawLayer:inContext:
gets called more often if I make the tile size of my tiled layer smaller.
是的当然。假设您的图层大小相同,那么如果您告诉它使用较小的图 block ,它将需要更多的图 block 来覆盖该区域。
Is my PDF page drawn/rendered x times?
由于您对每个图 block 调用一次 CGContextDrawPDFPage() ,因此可以。
但是,这可能不是问题,因为:
Does CGContextDrawPDFPage() magically know what part of the page to draw?
它可能,但它不需要任何魔法。
在 CATiledLayer 调用
-drawLayer:inContext:
之前,它将 CGContext 的剪辑设置为仅包含该图 block 的区域。 PDF 绘图代码可以获取剪辑边界(通过 CGContextGetClipBoundingBox
),然后选择仅呈现该矩形内的内容。也就是说,有两个警告:
CGContextDrawPDFPage()
是一个黑匣子,所以它实际上可能不会做那个优化。这似乎很明显,但您必须检查性能数据以查看它是否真的发生了。 CGContextDrawPDFPage
时,您仍可能会产生部分费用。 ——这真的取决于CG有多聪明,以及它是否在内部缓存东西。 Isn't CATiledLayer a waste of resources when rendering a PDF page? What is its advantage?
CATiledLayer 的优势主要在于节省内存:存储渲染内容的位图非常大,因此仅渲染和保留当前在屏幕上可见的内容是值得的。它还提供了一种机制,用于缓存最近可见或可能很快再次可见的区域,具体取决于用户缩放和滚动的方式。
权衡是:您必须将您的绘图分离到每个图 block 的单独调用中,并且您可能需要比其他方式更频繁地渲染到图 block 中。
根据您的 View 有多大、放大/缩小多远、绘制 PDF 的成本以及应用程序中发生的其他情况,使用 CATiledLayer 可能有意义,也可能没有意义。您可以查看性能数据并做出决定。
关于objective-c - CATiledLayer 基础知识 : Why is CATiledLayer's drawLayer:inContext: called so often when rendering PDFs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574617/