gpt4 book ai didi

ios - CALayer 和 drawRect

转载 作者:可可西里 更新时间:2023-11-01 03:40:03 26 4
gpt4 key购买 nike

View and Window Architecture说明,引用:

View 与核心动画层协同工作,以处理 View 内容的渲染和动画。 UIKit 中的每个 View 都由层对象(通常是 CALayer 类的实例)支持,它管理 View 的后备存储并处理与 View 相关的动画。

在“ View 绘制周期”部分的后面说明:

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

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

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

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

附:

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

我只是想了解ios View 层架构。

最佳答案

Does that mean, that the content drawn in a view in its drawRect method call, is captured in a snapshot in saved in its backing core animation layer?

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

If not, does that mean that CALayer is used to render "static" content, content that doesn't change very often, and drawRect is used to render content that changes often, for example in a game app?

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

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

关于ios - CALayer 和 drawRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15966219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com