Objective c CATiledLayer基础:为什么CATiledLayer';s drawLayer:inContext:在渲染PDF时经常调用?
我试图了解使用Objective c CATiledLayer基础:为什么CATiledLayer';s drawLayer:inContext:在渲染PDF时经常调用?,objective-c,ios,core-graphics,catiledlayer,Objective C,Ios,Core Graphics,Catiledlayer,我试图了解使用CGContextDrawPDFPage()呈现PDF页面时CATiledLayer是如何工作的 我的理解是,drawLayer:inContext:在每个瓷砖和细节级别上调用一次。对吗 在平铺层的委托中,我调用CGContextDrawPDFPage()。 然而,我注意到(通过将日志放入drawLayer:inContext:)如果我将平铺层的平铺大小减小,则调用drawLayer:inContext:的次数会增加。 这让我想知道: 我的PDF页面是否绘制/渲染了x次 或者CG
CGContextDrawPDFPage()
呈现PDF页面时CATiledLayer
是如何工作的
我的理解是,drawLayer:inContext:
在每个瓷砖和细节级别上调用一次。对吗
在平铺层的委托中,我调用CGContextDrawPDFPage()。
然而,我注意到(通过将日志放入drawLayer:inContext:
)如果我将平铺层的平铺大小减小,则调用drawLayer:inContext:
的次数会增加。
这让我想知道:
- 我的PDF页面是否绘制/渲染了x次
- 或者CGContextDrawPDFPage()是否神奇地知道要绘制页面的哪一部分
- 在呈现PDF页面时,CATiledLayer不是在浪费资源吗?它的优势是什么
因为食人魔。。。嗯,PDF就像洋葱。QuartzCore在很大程度上基于PDF渲染方法(以至于早期的文档甚至提到了这一事实),CATiledLayer使用特定的“平铺”渲染方法,该方法指定要重复绘制的对象。因此,当磁贴被移动或更新时,该层需要更多数据,因此在一个或多个背景线程中调用drawLayer:inContext: CATiledLayers也非常高效,因为它们大量使用缓存,并且只加载可见层 我注意到,如果我将平铺层的平铺大小减小,则调用
drawLayer:inContext:
的频率会更高
当然可以。假设层的大小相同,那么如果您告诉它使用较小的瓷砖,它将需要更多的瓷砖来覆盖该区域
我的PDF页面是否绘制/渲染了x次
因为每个磁贴调用一次CGContextDrawPDFPage(),所以是的
但是,这可能不是问题,因为:
CGContextDrawPDFPage()是否神奇地知道要绘制页面的哪一部分
可能吧,但它不需要任何魔法
在CATiledLayer调用-drawLayer:inContext:
之前,它将CGContext的剪辑设置为仅包括该平铺的区域。PDF绘图代码可以获取剪辑边界(通过),然后选择仅渲染该矩形内的内容
也就是说,有两个警告:
CGContextDrawPDFPage()
是一个黑匣子,因此它实际上可能不会进行优化。这似乎很明显,但你必须检查性能数据,看看它是否真的发生了CGContextDrawPDFPage
时,您可能仍会产生一些成本——这实际上取决于CG的智能程度,以及它是否在内部缓存内容根据视图的大小、放大/缩小的距离、PDF的绘制成本以及应用程序中发生的其他情况,使用CATiledLayer或不使用CATiledLayer可能有意义。由您查看性能数据并做出决定。我明白了。谢谢你对这个话题的解释。我希望有一天苹果会在这里添加更多的文档和API。尤其是在Safari中查看PDF时,它们现在似乎能够支持文本选择,但API并未公开。如果出现这种情况,文档可能会更新到。如果您希望看到有关此主题的其他文档,请向苹果公司建议,或者提交一个bug,或者使用基于web的文档上的“此文档帮助您了吗?”按钮。请具体说明您认为缺少的文档,因为它们无法读懂您的心思。我今天在查看示例代码时遇到了这个问题,在TitledPDFView中,它似乎填充了一个与滚动视图的整个大小相同的矩形(这是不正确的,它应该只填充上下文边界框表示的区域),然后它只调用CGContextDrawPDFPage,没有提到要显示pdf页面的哪一部分。我知道它有上下文,但仍然不清楚CGContextDrawPDFPage是否足够智能,可以只渲染该区域,或者整个pdf集中在该区域,等等。减少开销的方法是设置分幅大小,以确保不需要超过4个分幅来覆盖暴露的屏幕区域。