CGLayer和CALayer有什么区别和兼容性?

57

我对 CGLayerCALayer 感到困惑。它们看起来很相似,为什么需要有单独的实现? CGLayerCALayer 有何区别和兼容性?

1个回答

138

它们是完全不同的,且不兼容。

为了绝对清楚:

这只是一个巧合,"层"这个词在两个名称中都被使用; 它们是完全无关的。

CGLayer 是一种“特殊”的“高性能”东西。

你可以认为它们“像位图,但更好。”

苹果公司曾说过“我们厌倦了人们使用位图,让我们创造出更好的东西!” :-)

事实上,你只能离屏幕使用 CGLayers。

再强调一遍,CGLayers 只用于离屏渲染。

一旦准备好了,你就可以把它们显示到你的实际屏幕上 (也就是说: 把它们显示到你的其中一个视图上)。

(然而注意:CGLayers 经常被“单独”使用。当我说它们被“单独”使用时,我指的是它们用于图像处理或数学计算。在这种情况下, CGLayers 从未在屏幕上看到,它们与屏幕世界毫无联系。)

相反地... CALayers 简单来说就是视图中的东西。CALayers 就是视图的工作方式。

所以这两个概念都是完全不同的。

CALayers 只是视图中的东西。相比之下,CGLayers 是苹果公司的“离屏幕高性能计算机器”。

要明确的是, CGLayers 与视图没有任何关联和联系。(当然,你可以把 CGLayer 粘贴到视图中,但是你也可以像粘贴“排版设计”或“图像”那样将 CGLayer 粘贴到视图中,而这些并不是视图, CGLayers 也不是视图。)

一个典型的例子是:

如果你希望在屏幕上多次绘制某些复杂的内容,那么CGLayers正是解决这个问题的答案。你的“工作区”将成为一个CGLayer,然后你可以将其传输到打印机、屏幕或其他设备上。

明确一下,在我看来苹果应该选择一个不同的名称...

一个好的名字可以是“CGCalculationSpace(计算空间)”。

事实上,这个名称中包含单词“layer(图层)”,让人想起了NSLayers。

重申一遍:CGLayers与图层完全没有任何关系。它们没有任何形式的联系。名称中使用字母“l a y e r”的方式真的很令人困惑 - 真是可惜!

CGLayers可能应该被称为“workspaces(工作区)”或“calculation paradigms(计算范式)”或类似的名称。


4
非常感谢!我完整地阅读了这篇文章。它的描述很好,非常有帮助。尤其是关于CGLayer和CALayer的区别:'离屏合成'与'实时合成'以及两者之间的'不兼容性'。通过您的描述,我对CALayer作为CGLayer的抽象化、面向对象的模型有了一个理解。(场景图?)无论如何,再次感谢! - eonil
2
我重新阅读了你的回答,意识到我有一个误解。CGLayer与CALayer没有任何关系。CGLayer是绘图工具的一部分,而CALayer是合成器的一部分。 - eonil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接