Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CATiledLayer基础:为什么CATiledLayer';s drawLayer:inContext:在渲染PDF时经常调用?_Objective C_Ios_Core Graphics_Catiledlayer - Fatal编程技术网

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()
    是一个黑匣子,因此它实际上可能不会进行优化。这似乎很明显,但你必须检查性能数据,看看它是否真的发生了
  • 在解析和布局PDF内容时仍有相当大的开销。在每次调用
    CGContextDrawPDFPage
    时,您可能仍会产生一些成本——这实际上取决于CG的智能程度,以及它是否在内部缓存内容
  • 在呈现PDF页面时,CATiledLayer不是在浪费资源吗?它的优势是什么

    CATiledLayer的优势主要在于节省内存:渲染内容存储在其中的位图非常大,因此只渲染并保留屏幕上当前可见的内容是值得的。它还提供了一种机制,用于缓存最近可见或可能很快再次可见的区域,具体取决于用户缩放和滚动的方式

    折衷的办法是:您必须将图形分割为每个分幅的单独调用,并且您可能需要比其他方式更频繁地渲染为分幅


    根据视图的大小、放大/缩小的距离、PDF的绘制成本以及应用程序中发生的其他情况,使用CATiledLayer或不使用CATiledLayer可能有意义。由您查看性能数据并做出决定。

    我明白了。谢谢你对这个话题的解释。我希望有一天苹果会在这里添加更多的文档和API。尤其是在Safari中查看PDF时,它们现在似乎能够支持文本选择,但API并未公开。如果出现这种情况,文档可能会更新到。如果您希望看到有关此主题的其他文档,请向苹果公司建议,或者提交一个bug,或者使用基于web的文档上的“此文档帮助您了吗?”按钮。请具体说明您认为缺少的文档,因为它们无法读懂您的心思。我今天在查看示例代码时遇到了这个问题,在TitledPDFView中,它似乎填充了一个与滚动视图的整个大小相同的矩形(这是不正确的,它应该只填充上下文边界框表示的区域),然后它只调用CGContextDrawPDFPage,没有提到要显示pdf页面的哪一部分。我知道它有上下文,但仍然不清楚CGContextDrawPDFPage是否足够智能,可以只渲染该区域,或者整个pdf集中在该区域,等等。减少开销的方法是设置分幅大小,以确保不需要超过4个分幅来覆盖暴露的屏幕区域。