gpt4 book ai didi

ios - 正在绘制圆角 drawRect : faster than using CALayer setCornerRadius?

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

在2011年的WWDC video session 121中,presenter为了提升UI的性能,选择了使用drawRect:中的UIBezierPath绘制圆角,而不是直接在layer上设置圆角半径。

为什么使用 UIBezierPath 绘图必然更快? drawRect:发生在也可能很慢的软件中。

最佳答案

简短的回答:可能只是坚持使用 CALayer 的 cornerRadius,直到您发现性能问题。

长答案:

我们首先需要区分“绘图”和“合成”。

在 iOS 上绘图是用像素填充纹理的简单操作(CPU 受限任务)。合成是将所有这些纹理拼合成单个帧以打印到屏幕的行为(GPU 限制任务)。一般来说,当滚动或动画时,你主要是在给 GPU 增加负担,这很好,因为像将所有像素向下移动一个这样的事情是 GPU 早餐吃的东西。

-drawRect: 是纯绘图,使用 CPU 填充纹理。 CALayer 的 cornerRadius 是在合成步骤完成的,对 GPU 有压力。

使用 -drawRect: 具有非常高的初始成本(它很容易花费比一帧更长的时间)和不平凡的内存使用,但之后滚动非常平滑(它现在就像任何其他纹理一样只是一个纹理)。使用 CALayer 的圆角半径创建一堆具有圆角半径的 View 快得离谱,但是一旦你获得了十几个 View ,你就可以和滚动速度说再见了(因为 GPU 不仅要执行正常的滚动任务,还需要继续将圆角半径添加回您的 View )。

但是不要相信我的话,请做一些数学运算。我改编了Florian Kugler’s benchmark并在运行 iOS 6.1.3 的 iPhone 4S 上运行。我测量了在 1/60 秒内最初可以创建多少个 View ,然后测量在帧速率降至 60fps 以下之前可以对多少个 View 进行动画处理。换句话说:前期成本与帧率成本。

                                        | -drawRect:     | CALayer’s cornerRadusmax number of views rendered in 16.6ms  |     5 views    |     110 viewsmax number of views animating at 60fps  |    ~400 views  |     12 views

(请注意,应用程序因在 500 -drawRect: views 时使用过多内存而被终止)

归根结底,在我自己的项目中,我倾向于尽可能多地使用 CALayer 的 cornerRadius。我很少需要超过几个带有圆角的 View ,而 -drawRect: 对初始性能影响太大。将 View 子类化只是为了绕过角落,呃。

但无论您最终选择哪种方法,请务必衡量并关注您的应用的流畅度和响应速度,并做出相应的响应。

关于ios - 正在绘制圆角 drawRect : faster than using CALayer setCornerRadius?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601546/

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