iphone - 那么 CALayer 不包含 View 的内容位图?

标签 iphone cocoa-touch ipad ios uiview

来自文档:

"Layers are lightweight objects (CALayer) that, though similar to views, are actually model objects assigned to views."

对我来说,轻量级排除了内容的任何重位图。我相信 CALayer 是“真实”的东西,而 UIView 只是它的包装器。每个 View 在不同的树(模型、演示、渲染)中都有 3 个 CALayer。所以没有 3 个位图?只有一个?

最佳答案

关于 CALayer 的术语“轻量级”来自于 Mac 上的那篇文档。正如 Joe 指出的那样,与 iPhone 的 UIView 相比,NSView 是一个相当复杂的 UI 元素。即使在资源受限的移动设备上,您也可以在屏幕周围设置数十个 UIView 的动画,但是当您开始向屏幕添加许多 NSView 时,NSView 会给系统带来更多压力。这是 UIKit 相对于 AppKit 的全新开始所获得的好处之一,因为 UIKit 从一开始就有核心动画,Apple 有机会从 AppKit 中学习哪些有效,哪些无效。

相比之下,CALayer 对其正在绘制的基于 GPU 的底层位图矩形纹理添加的内容很少,因此它们不会增加很多开销。在 iPhone 上,这与 UIView 没有太大区别,因为 UIView 只是 CALayer 的轻量级包装器。

在这一点上我不同意 Count Chocula,并说 CALayer 似乎确实在 GPU 上包裹了位图纹理。是的,您可以指定自定义 Quartz 绘图来构成图层的内容,但该绘图仅在必要时进行。一旦绘制了层中的内容,就不需要重新绘制要移动的层或以其他方式进行动画处理。如果您对图层应用变换,您会看到它在放大时像素化,这表明它不处理矢量图形。

此外,使用 Core Plot 框架(以及在我自己的应用程序中),我们不得不覆盖 CALayers 的正常绘制过程,因为正常的 -renderInContext: 方法不适用于 PDF。如果您使用它来将图层及其子图层渲染​​到 PDF 中,您会发现图层在最终 PDF 中由光栅位图表示,而不是它们应有的矢量元素。只有使用不同的渲染路径,我们才能为我们的 PDF 获得正确的输出。

我还没有尝试使用 iOS 3.2 中新的 shouldRasterizerasterizationScale 属性,看看它们是否改变了处理方式。

事实上,当您将位图内容考虑在内时,您会发现 CALayer(以及 UIView 及其支持层)确实会消耗大量内存。 “轻量级”措施是他们在内容之上添加了多少,这是非常少的。您可能看不到对象分配等工具的内存使用情况,但是当您向应用程序添加大层时查看内存监视器,您会看到应用程序或 SpringBoard(拥有 Core Animation 服务器)中的内存峰值。

当谈到表示层与模型层时,位图在它们之间不会重复。在给定的时刻,应该只有一个位图纹理显示在屏幕上。不同层仅在任何给定时刻跟踪属性和动画,因此每个层中存储的信息很少。

关于iphone - 那么 CALayer 不包含 View 的内容位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299295/

相关文章:

iphone - 如何在另一个 NIB 的 View 内加载一个 NIB?

iphone - 如何在 UILabel 中按顺序显示字符串中的字符?

iphone - 获取 navigationItem.titleView layoutSubviews 的正确边界

iphone - 如何从应用程序委托(delegate)、 Storyboard、iOS6 获取我的 View Controller 的实例

ios - 使用后台线程更新界面的更快方法

objective-c - 检查并删除 NSSet 中的对象

ipad - 检查 iPad 是否具有 iOS 9 中的多任务处理功能 - 以编程方式

iphone - 每 30 分钟执行一次选择器

iphone - 当点击网页内播放 YouTube 视频时,iOS 6.1 UIWebview 崩溃

android - 键盘打开时纵向模式被误解为横向