ios – 为什么-drawRect比为UITableViews使用CALayersUIViews更快?

ios – 为什么-drawRect比为UITableViews使用CALayersUIViews更快?,第1张

概述我已经可以听到一千个iOS开发人员的痛苦. 不,我不是菜鸟. 为什么-drawRect对于UITableView性能比具有多个视图更快? 我知道合成 *** 作发生在GPU上.但合成是一次性的 *** 作;一旦层被提交到内存,它与缓存的缓冲区没有区别,从GPU的角度来看,它被转换为视图内外.将此与在drawRect中使用Core Graphics进行比较,后者在CPU上使用未知数量的 *** 作来生成最终在CALayer 我已经可以听到一千个iOS开发人员的痛苦.

不,我不是菜鸟.

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

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

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

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

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

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

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

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

如果是静态内容

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

如果是动态内容

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

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

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

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

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

他们都不是你的情况?

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

总结

以上是内存溢出为你收集整理的ios – 为什么-drawRect比为UITableViews使用CALayers / UIViews更快?全部内容,希望文章能够帮你解决ios – 为什么-drawRect比为UITableViews使用CALayers / UIViews更快?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1053386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存