当您谈论优化时,您需要提供具体的情况和条件和限制。因为优化都是关于微观管理的。否则,它是没有意义的。
你更快的基础是什么?你是怎么测量的?数字是多少?
例如,无操作或非常简单-drawRect:可以更快,但这并不意味着它总是如此。
我也不知道 CA 的内部设计。所以这是我的猜测。
如果是静态内容
您的绘图代码不断被调用,这很奇怪。因为会缓存绘制结果,在您发送消息CALayer之前不会再次绘制。setNeedsDisplay如果您不更新单元格的内容,则与单个位图图层相同。应该比多个合成层更快,因为它不需要合成成本。如果您只使用少量足以同时存在于池中的单元,则无需更新。随着最近型号的 RAM 变得更大,它更有可能在最近的型号中发生。
如果是动态内容
如果它不断更新,则意味着您实际上是在自己更新它们。因此,也许您的图层合成版本也会不断更新。这意味着它正在为每一帧再次合成。它可能会因复杂和庞大而变慢。如果它复杂且大并且有很多重叠区域,它可能会更慢。我猜如果 CA 无法确定可以忽略哪些区域,它会严格绘制所有内容。不像你可以选择画什么或不画什么。
如果实际绘图是在 CPU 中完成的
即使您将视图配置为许多层的纯组合,最终也应该绘制每个子层。并且不能保证在 GPU 中绘制它们的内容。例如,我相信CATextLayer是在 CPU 中绘制自己。(因为在当前的移动 GPU 上用多边形绘制文本在性能方面没有意义)还有一些过滤效果。在这种情况下,总成本将相似,而且还需要合成成本。
在 CPU 和 GPU 负载均衡的情况下
如果您的 GPU 因层数过多或直接 OpenGL 绘图而非常忙于繁重的负载,则您的 CPU 可能处于空闲状态。如果您的 CG 绘图可以在空闲 CPU 时间内完成,那么它可能比给 GPU 提供更多负载要快。
他们都不是你的情况?
如果您的情况不是我上面列出的情况,我真的很想看看和检查 CG 代码的绘制速度比 CA 合成的速度快。我希望你附上一些源代码。