为什么-drawRect比为UITableViews使用CALayers/UIViews更快?

Dan*_*maa 4 core-graphics uitableview ios

我已经可以听到一千个iOS开发人员的痛苦.

不,我不是菜鸟.

为什么-drawRect对于UITableView性能比具有多个视图更快?

我知道合成操作发生在GPU上.但合成是一次性的操作; 一旦层被提交到内存,它与缓存的缓冲区没有区别,从GPU的角度来看,它被转换为视图内外.将此与在drawRect中使用Core Graphics进行比较,后者在CPU上使用未知数量的操作来生成最终在CALayers中缓存的像素.如果它最终都缓存和扁平化有什么区别?

此外,如果您正确处理单元重用,则不需要在每次调用-cellForRowAtIndexPath时重新生成视图.实际上,使用UIView/CALayer对象缓存的状态数据(字体,字体大小,文本颜色,属性等)比在-drawRect期间不断重新创建它们可能有性能优势.

为什么drawRect的热潮?有人可以给我指点吗?

Eon*_*nil 5

在谈论优化时,您需要提供具体的情况,条件和限制.因为优化是关于微观管理的.否则,它毫无意义.

你的速度更快的基础是什么?你是怎么测量的?数字是多少?

例如,no-op或非常简单-drawRect:可以更快,但并不意味着它总是这样.

我也不知道CA的内部设计.所以这是我的猜测.

如果是静态内容

你的绘图代码被不断调用很奇怪.因为CALayer缓存绘制结果,并且在发送setNeedsDisplay消息之前不会再绘制它.如果不更新单元格的内容,则它与单个位图图层相同.应该比多个合成图层更快,因为它不需要合成成本.如果您只使用足够小的单元格同时存在于池中,则不需要更新.随着RAM在最近的模型中变得越来越大,它更有可能在最近的模型中发生.

如果是动态内容

如果它不断更新,则意味着您实际上是在自己更新它们.因此,您的图层合成版本也可能会不断更新.这意味着每个帧都会再次合成.它可能会因为复杂而庞大而变慢.如果它复杂而且很大并且有很多重叠区域,那么它可能会更慢.如果无法确定哪些区域可以忽略,我猜CA会严格绘制所有内容.不像你可以选择画什么.

如果实际绘图是在CPU中完成的

即使您将视图配置为多层的纯组合,也应最终绘制每个子图层.并且不保证在GPU中绘制他们的内容.例如,我相信CATextLayer是在CPU中.(因为在当前移动GPU上使用多边形绘制文本在性能方面没有意义)和一些过滤效果也是如此.在这种情况下,总体成本将是相似的,加上它需要合成成本.

在CPU和GPU均衡负载的情况下

如果您的GPU非常忙于重载,因为层数太多或直接使用OpenGL图形,您的CPU可能处于空闲状态.如果您的CG绘图可以在空闲CPU时间内完成,那么它可能比为GPU提供更多负载更快.

他们都不是你的情况?

如果您的情况不是我上面列出的情况,我真的想看到并检查CG代码比CA组合绘制更快.我希望你附上一些源代码.