来自文档:
“图层是轻量级对象 (CALayer)虽然类似于 视图,实际上是模型对象 分配给观点。“
轻量级对我来说排除了任何重要的内容位图。我相信CALayer是“真正的”东西,而UIView只是它的包装。每个视图在不同的树(模型,演示文稿,渲染)中有3个CALayers。那么没有3个位图?只有一个?
答案 0 :(得分:17)
关于CALayer的术语“轻量级”来自于源自Mac的那篇文档。正如Joe指出的那样,与iPhone的UIView相比,NSView是一个相当复杂的UI元素。即使是资源受限的移动设备,您也可以在屏幕上为数十个UIView设置动画,但是当您开始在屏幕上添加许多UView时,NSView会给系统带来更大的压力。这是UIKit在AppKit上重新开始的事情之一,因为UIKit从一开始就拥有Core Animation,Apple有机会学习AppKit中哪些有效,哪些无效。
相比之下,CALayer很少添加它正在绘制的基于GPU的位图矩形纹理,因此它们不会增加很多开销。在iPhone上,这与UIView没有什么不同,因为UIView只是一个围绕CALayer的轻量级包装器。
我将不同意Count Chocula,并说CALayer似乎确实在GPU上包裹了一个位图纹理。是的,您可以指定自定义Quartz绘图来组成图层的内容,但该绘图仅在必要时进行。一旦绘制了图层中的内容,就不需要重新绘制要移动的图层或以其他方式设置动画。如果将变换应用于图层,则会在放大时看到它变为像素化,这表示它不处理矢量图形。
此外,使用Core Plot框架(以及我自己的应用程序),我们必须覆盖CALayers的正常绘制过程,因为正常的-renderInContext:
方法对PDF不起作用。如果使用此方法将图层及其子图层渲染为PDF,您会发现最终PDF中的图层由栅格位图表示,而不是它们应该是的矢量元素。只有使用不同的渲染路径,我们才能为PDF获得正确的输出。
我还没有使用iOS 3.2中新的shouldRasterize
和rasterizationScale
属性来查看它们是否会改变处理方式。
事实上,当你考虑到位图内容时,你会发现CALayers(以及带有支持层的UIViews)会占用大量内存。 “轻量级”衡量标准是它们在内容之上添加了多少,这是非常少的。您可能无法从像对象分配这样的工具中看到内存使用情况,但在向应用程序添加大图层时会查看内存监视器,并且您将看到应用程序或SpringBoard(拥有Core Animation服务器)中的内存峰值。 / p>
当涉及表示层与模型1时,位图之间不会重复。在给定时刻应该只有一个位图纹理显示在屏幕上。不同的图层仅在任何给定时刻跟踪属性和动画,因此每个图层中都存储的信息非常少。
答案 1 :(得分:2)
我理解它的方式,CALayer是Quartz绘图表面的表示。您无法在位图方面真正考虑它,而是封装绘图上下文的当前状态的容器,包括其内容,转换,阴影等。基本上,它在尽可能接近GPU的同时保留在Cocoa中,但它与表示位图不同 - 相反,它代表了在您指示时重现其内容所需的所有信息。因此,例如,如果在其上绘制一条线,则内部层可以简单地将线的坐标传递给GPU,让后者绘制它,而不必担心渲染它所需的像素。
与UIView相比,图层是“轻量级”的,因为它只关注显示操作本身,而不涉及响应事件或触摸等事情。
同时具有模型和表示层的原因是后者表示图层的当前状态,并将所有动画都考虑在内。这就是为什么,例如,文档建议您对表示层进行测试。