2017-05-24 46 views
0

我有很多小反刍,不透明,纯色,不重叠,频繁变化的位置和大小。以不同的方式渲染它们总会在实际设备上产生滞后。我尝试以下方法:在iOS中渲染大量矩形的最快方法?

  • 呈现所有通过CGContextdraw(inRect:)方法
  • 使用个人CAShapeLayer每个矩形实例
  • 使用CALayer情况下,预渲染的内容 - 在表现最好的,但产生的假象上边界时rects是缩放
  • UIimageView实例具有小预生成的图像

也试图调整各种CALayer选项(前。 edgeAntialiasingMask,drawsAsynchronously,shouldRasterize ...),但仍不能消除滞后。

example

那么,有没有办法工作要做到这一点并没有得到/最小滞后?

与测量

更新,并回答

感谢@Saurav在评论文章中,我已经与时间轮廓发现UIView.convert(rect: to:)方法吃的CPU时间的35%,UIView.setFrame(...)吃另外15%。

刷新帧时,渲染本身不会消耗大量的CPU时间 - 通过draw(inRect:)和预渲染的UIImageView检查方法。

+0

使用OpenGL或者,如果所有目标设备都支持它,则为Metal。 –

+2

看起来像少于1000个矩形。这看起来不是很多(我使用标准Core Graphics w/o lag在60fps的旧iPad 3上绘制了超过5000行)。我会首先怀疑你的布局算法。你从仪器上看到什么?你受限于CPU吗?你为什么认为这是绘图本身?这似乎确实是'CALayer'的建造目的。我不明白你为什么要预渲染,只是有一个简单的背景颜色。 (也就是说,如果你可以控制计算,我可能会实现w /'draw(inRect:)') –

+0

@robmayoff我忘了提及,OpenGL是非常有边缘的情况,因为它生活在不同的'世界'中。希望能够找到更多'UIView'友好的方法 – brigadir

回答

0

你跟着这些: 1.避免创建CALayer或UIView的多个实例。 2.在viewDidLoad中创建所有1000个图层或视图,并在需要时更新框架。

您正在执行的帧计算可能会阻塞该线程。

+0

当然,我只在加载时创建所有实例一次。当我更新帧时存在滞后。 – brigadir

+0

它可能是您正在执行的框架计算,阻塞线程。你怎么计算帧? – Saurav

+0

你是完全正确的!奇怪的是,当我调查这个问题时,我错过了这个范围。当然最重的方法是“convert(rect:to:)'。我更新了测量数据的问题 – brigadir