所以一个CALayer不包含一个视图的内容位图?
从文档:
“层是轻量级的对象(CALayer),尽pipe类似于视图,实际上是分配给视图的模型对象。
对于我来说轻量级排除任何内容的重磅位图。 我相信CALayer是“真实”的东西,而UIView只是它的包装。 每个视图在不同的树(模型,演示文稿,渲染)中有3个CALayer。 那么没有3位图? 只有一个?
关于CALayer的术语“轻量级”来源于源于Mac的那一段文档。 正如Joe指出的,与iPhone的UIView相比,NSView是一个相当复杂的UI元素。 您甚至可以在资源受限的移动设备上围绕屏幕制作数十个UIViewanimation,但是当您将许多animation添加到屏幕上时,NSView会给系统带来更大的压力。 这是UIKit在AppKit上重新开始所取得的成果之一,因为UIKit从一开始就拥有了Core Animation,而且Apple有机会从AppKit中的工作和什么都没有学到什么。
相比之下,CALayer对于绘制的底层基于GPU的位图矩形纹理增加的很less,所以它们不会增加很多开销。 在iPhone上,这和UIView并没有什么不同,因为UIView只是一个CALayer的轻量级包装。
我不同意Chocula计数,并且说CALayer似乎在GPU上包装了一个位图纹理。 是的,您可以指定自定义的Quartz绘图来组成图层的内容,但该绘图仅在必要时发生。 一旦绘制了图层中的内容,就不需要重绘要移动的图层或以其他方式animation。 如果将变换应用于图层,则在放大图像时会看到图像变形,这表示图像不处理vectorgraphics。
此外,使用Core Plot框架(以及我自己的应用程序),我们必须重写CALayers的正常绘图过程,因为normal -renderInContext:
方法对于PDF不适用。 如果使用它来将图层及其子图层渲染为PDF,则会发现图层由最终PDF中的栅格位图表示,而不是它们应该包含的向量元素。 只有通过使用不同的渲染path,我们才能够为我们的PDF获得正确的输出。
我还没有玩在iOS 3.2中的新的shouldRasterize
和rasterizationScale
属性,看看他们是否改变了这种处理的方式。
事实上,你会发现CALayers(和UIViews及其支持层)在考虑位图内容时会消耗大量内存。 “轻量级”的措施是在内容上添加多less,这是很less的。 你可能看不到像Object Allocations这样的工具的内存使用情况,但是当你向你的应用程序中添加大图层时,你会看到内存监视器,并且你的应用程序或SpringBoard(它拥有Core Animation服务器)会看到内存高峰。
当涉及表示层与模型之间时,位图不会在它们之间重复。 应该只有一个位图纹理在给定的时刻显示在屏幕上。 不同的层只是在任何给定的时刻跟踪属性和animation,所以每个信息都很less存储。
按照我的理解,CALayer是Quartz绘图表面的代表。 在位图方面,你不能真正想到它,而是一个封装了绘图上下文的当前状态的容器,包括其内容,转换,阴影等等。 它基本上尽可能接近GPU,同时保留在Cocoa中,但它不像表示位图一样 – 而是代表所有必要的信息来重现它的内容,就像你指示的那样。 所以,例如,如果你在它上面画一条线,那么图层内部可以简单地将线的坐标传递给GPU,让后者绘制它,而不必担心渲染它所需的像素。
与UIView相比,一个图层是“轻量级”的,因为它只涉及显示操作,而不涉及响应事件或触摸等等。
同时具有模型和表示层的原因是后者代表图层的当前状态,并保留所有animation。 这就是为什么,例如,文档build议您对表示层进行testing。