objective-c - CATiledLayer 基础知识 : Why is CATiledLayer's drawLayer:inContext: called so often when rendering PDFs?

标签 objective-c ios core-graphics catiledlayer

我试图了解 CATiledLayer在使用 CGContextDrawPDFPage() 渲染 PDF 页面时有效.

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

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

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

    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()是一个黑匣子,所以它实际上可能不会做那个优化。这似乎很明显,但您必须检查性能数据以查看它是否真的发生了。
  • 解析和布局 PDF 内容仍有相当大的开销。每次调用 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/

    相关文章:

    ios - 以编程方式添加到导航栏的 UIBarButtonItem 无法调用选择器,而添加到工具栏的按钮却可以

    ios - 当 View Controller 在本地显示并显示警报时,控件不会变暗

    ios - CIImage 和 CIFilter 实现细节

    ios - UITableviewCell 内容中的核心文本重叠、重复并叠加在其他单元格上

    iphone - 如果安装了 IOS 6,则在操作表上显示按钮

    ios - 在 iOS 7 中更新约束后获取 "Unable to simultaneously satisfy constraints"

    html - 在父窗口中打开 iFrame 中的链接(无法控制子站点)

    cocoa - CGBitmapContext 获取像素值 Leopard 与 SnowLeopard 混淆

    objective-c - 如何控制MPMoviePlayerController的播放时间?

    java - Objective c - 静态成员和常量