在 iOS 上,从上下文创建层并获取层的上下文后,这些上下文如何相互关联?



我们可以从当前图形上下文创建一个图层,然后获取该图层的上下文:

CGContextRef context = UIGraphicsGetCurrentContext();
CGLayerRef layer = CGLayerCreateWithContext(context, 
                                            CGSizeMake(self.frame.size.width,
                                                self.frame.size.height), NULL);
CGContextRef contextOfLayer = CGLayerGetContext(layer);

所以我们现在有 2 个上下文:contextcontextOfLayer . 这两种背景如何相互关联? contextOfLayer实际上是context的一部分,并且context具有图层上下文指针数组吗? 如果我使用 NSLog(@"%p", ...) 打印出它们的地址,它们具有不同的地址,因此它们不是同一个对象。 而且我认为contextOfLayer不会影响上下文堆栈,那么它是否只是一个独立的上下文,只是本身"存在"?

如果您了解CGLayer的基本原理,它会有所帮助。 当您将相同的内容重复绘制到特定类型的上下文中时,CGLayer意味着优化。

(例如:具有特定格式的位图上下文 - 例如 32 位 RGBA - 或 PDF 上下文等(

创建 CGLayer 时,将要绘制CGLayer的上下文传递给它。 这使CGLayer可以针对这种上下文进行自我优化。

稍后,如果将CGLayer绘制到该上下文或具有相同格式的其他上下文中,则绘制速度会更快。

如果将CGLayer绘制到具有不同格式的上下文中,则绘制仍将有效,并且不会收到错误。但是,它可能不会比您直接绘制到该上下文中时更快。

CGLayerCreateWithContext的文档说:

上下文

要创建相对于其创建的图层的图形上下文。 图层使用此图形上下文作为 初始化。

这意味着图层将给定context视为参考。这并不一定意味着context存储在CGLayer中或永久引用。可能是,但你无法判断 - 这是一个内部实现细节。

CGLayerGetContext的文档说

返回的上下文是图层本身的上下文,而不是您在创建图层时指定的上下文。

所以你应该期待context != contextOfLayer.

同样,API 没有指定任何关于这些上下文如何相互关联的内容——它们可能在内部相互引用,也可能不引用。作为API的用户,我们不应该假设任何事情。

具体回答您的问题:

contextOfLayer 实际上是上下文的一部分,并且上下文具有层上下文指针数组吗?

我们不知道,也找不到。作为 API 的用户,我们不应该编写任何假设这样或那样的代码。

我认为contextOfLayer不会影响上下文堆栈,那么它只是一个独立的上下文,只是自己"存在"吗?

是的,这是一个独立的背景。UIKit 中的"上下文堆栈"是一个更高层次的概念。 CoreGraphics 中的CGLayer是一个较低级别的 API,对UIKit一无所知。

相关内容

  • 没有找到相关文章

最新更新