【问题标题】:CALayer & drawRectCALayer 和 drawRect
【发布时间】:2013-04-04 16:15:25
【问题描述】:

View and Window Architecture 中声明,引用:

视图与核心动画层一起处理视图内容的渲染和动画。 UIKit 中的每个视图都有一个图层对象(通常是 CALayer 类的实例)支持,该对象管理视图的后备存储并处理与视图相关的动画。

在“视图绘图周期”部分进一步说明:

UIView 类使用按需绘制模型来呈现内容。当一个视图首次出现在屏幕上时,系统会要求它绘制其内容。 系统会捕获此内容的快照,并将该快照用作视图的视觉表示。

这是否意味着,在其 drawRect 方法调用中在视图中绘制的内容被捕获在保存在其支持核心动画层中的快照中?

如果不是,这个内容快照“驻留”在哪里?

如果不是,这是否意味着 CALayer 用于渲染“静态”内容,即不经常更改的内容,而 drawRect 用于渲染经常更改的内容,例如在游戏应用中?

附言

这些问题与任何特定的代码实现无关。

我只是想了解ios的视图层架构。

【问题讨论】:

    标签: ios uiview calayer


    【解决方案1】:

    这是否意味着,在其 drawRect 方法调用中在视图中绘制的内容被捕获在保存在其支持核心动画层中的快照中?

    是的。一切都在引擎盖下使用层。 UIView 的-drawRect 将捕获您绘制的内容并(据我所知)在视图的子层上设置content。它甚至可以在主层对象上执行此操作。这就是保存“快照”的地方。

    如果不是,这是否意味着 CALayer 用于渲染“静态”内容, 不经常变化的内容,用drawRect来渲染 经常变化的内容,例如在游戏应用中?

    内容更改的频率并不会真正影响选择。使用 drawRect 与手动创建 CALayers 没有太大区别。这取决于您想如何组织视图中的子元素,或者您是否想创建没有UIView 细节的低级可重用层对象(例如CATextLayer)。如果您有各种不同的子元素要绘制,那么您可以使用自己的自定义绘图代码将它们分成不同的层。如果您只有一个简单的内容要绘制,您可以在一个 drawRect 实现中完成所有操作。

    话虽如此,您确实需要注意每一层最终将成为一个单独的 GPU“元素”,因此减少您拥有的层数或使用 shouldRasterize+@ 可以带来性能优势987654328@ 父层的属性。这将拍摄整个图层层次结构的快照,并创建一个要渲染的栅格化图像,而不是 n 个单独的图像。

    【讨论】:

      【解决方案2】:

      这是否意味着,在其 drawRect 方法调用中在视图中绘制的内容被捕获在保存在其支持核心动画层中的快照中?

      两个词:“实现细节”

      如果不是,这是否意味着 CALayer 用于渲染“静态”内容,即不经常更改的内容,而 drawRect 用于渲染经常更改的内容,例如在游戏应用中?

      不完全是。图层非常擅长为内容制作动画(正如框架名称 Core Animation 所暗示的那样)。 drawRect 适合高级绘图,但重绘每一帧可能会很慢(显然取决于您正在绘制的内容)。

      我没有在您的问题中看到任何提及 the Core Animation Programming Guide 的内容。这是了解有关视图层部分的更多信息的好地方。

      【讨论】:

      • Layers 擅长动画化同一次绘制的内容,drawRect 每次调用都会重绘内容?
      • 层也擅长在值之间进行插值。例如对背景颜色、位置、变换、边框宽度等进行动画处理。
      【解决方案3】:

      每个 UIView 都有一个底层的 CALayer(这是实际呈现在屏幕上的内容)。

      CALayer 只是一个位图(保存像素)。当您调用 setNeedsDisplay 到您的视图时,CALayer 被标记为重绘。在运行循环结束时,处理完事件后,会创建一个 CGContextRef 并调用 drawRect 委托。然后将内容绘制到创建的上下文中,然后将其复制到位图中并最终与其他图层合成以显示在屏幕上。

      所以是的,“快照”存储在 CALayer 中。这只是一种优化,以便图层不必重绘自己,除非它们被标记为重绘(使用 setNeedsDisplay)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        相关资源
        最近更新 更多