在 iOS 中渲染大量矩形的最快方法?
The fastest way to render huge amount of rectangles in iOS?
我有很多小矩形,不透明,纯色,不重叠,位置和大小经常变化。以不同的方式呈现它们总是会在真实设备上产生滞后。我尝试了以下方法:
- 在
draw(inRect:)
方法中通过CGContext
渲染所有
- 为每个矩形使用单独的
CAShapeLayer
个实例
- 使用
CALayer
具有预渲染内容的实例 - 性能最佳,但在矩形缩放时会在边界上产生伪影
UIimageView
个具有小型预生成图像的实例
还尝试调整各种 CALayer
选项(例如 edgeAntialiasingMask
、drawsAsynchronously
、shouldRasterize
...),但仍无法消除延迟。
那么,是否有可行的方法来做到这一点并获得 no/minimum 滞后?
更新测量值和答案
感谢@Saurav 在评论中提供的提示,我发现 UIView.convert(rect: to:)
方法消耗了 CPU 时间的 35%,而 UIView.setFrame(...)
消耗了另外 15% .
刷新帧时渲染本身不会消耗大量 CPU 时间 - 通过 draw(inRect:)
检查方法并预渲染 UIImageView
。
你有没有关注这些:
1. 避免创建多个 CALayer 或 UIView 实例。
2. 在 viewDidLoad 中创建所有 1000 层或视图一次,并在需要时更新框架。
您正在进行的帧计算可能会阻塞线程。
我有很多小矩形,不透明,纯色,不重叠,位置和大小经常变化。以不同的方式呈现它们总是会在真实设备上产生滞后。我尝试了以下方法:
- 在
draw(inRect:)
方法中通过CGContext
渲染所有 - 为每个矩形使用单独的
CAShapeLayer
个实例 - 使用
CALayer
具有预渲染内容的实例 - 性能最佳,但在矩形缩放时会在边界上产生伪影 UIimageView
个具有小型预生成图像的实例
还尝试调整各种 CALayer
选项(例如 edgeAntialiasingMask
、drawsAsynchronously
、shouldRasterize
...),但仍无法消除延迟。
那么,是否有可行的方法来做到这一点并获得 no/minimum 滞后?
更新测量值和答案
感谢@Saurav 在评论中提供的提示,我发现 UIView.convert(rect: to:)
方法消耗了 CPU 时间的 35%,而 UIView.setFrame(...)
消耗了另外 15% .
刷新帧时渲染本身不会消耗大量 CPU 时间 - 通过 draw(inRect:)
检查方法并预渲染 UIImageView
。
你有没有关注这些: 1. 避免创建多个 CALayer 或 UIView 实例。 2. 在 viewDidLoad 中创建所有 1000 层或视图一次,并在需要时更新框架。
您正在进行的帧计算可能会阻塞线程。