为了提高性能,在iOS上隐藏或删除Calayer是否更好?

为了提高性能,在iOS上隐藏或删除Calayer是否更好?,ios,performance,calayer,Ios,Performance,Calayer,这与以下问题有关: 我目前有一个视图,可以有几百个Calayer。我知道有很多Calayer会导致处理器限制的性能下降,但我想看看是否有人尝试过以下几种方法,并能提供指导 为了更好地让你了解我在做什么,想象我在我的图层上画了一个点。当我放大时,我希望圆点变成星星。当我缩小时,我希望星星回到一个点。现在想象一下,我有数百个这样的点 重绘单层与重绘多层 当缩放改变时,我没有在一个图层上重新绘制,而是尝试在两个单独的图层上预先绘制,当缩放改变时,我只隐藏一个图层,显示另一个图层 [layer conf

这与以下问题有关:

我目前有一个视图,可以有几百个Calayer。我知道有很多Calayer会导致处理器限制的性能下降,但我想看看是否有人尝试过以下几种方法,并能提供指导

为了更好地让你了解我在做什么,想象我在我的图层上画了一个点。当我放大时,我希望圆点变成星星。当我缩小时,我希望星星回到一个点。现在想象一下,我有数百个这样的点


重绘单层与重绘多层

当缩放改变时,我没有在一个图层上重新绘制,而是尝试在两个单独的图层上预先绘制,当缩放改变时,我只隐藏一个图层,显示另一个图层

[layer configureWithZoom:zoom];
[layer setNeedsDisplay];
vs

我知道有一堆层会增加我的内存占用,如果我以前有50层,现在就有100层了。但就性能而言,这会有所帮助吗

隐藏与删除

鉴于上述情况,我现在有了一些在任何时候都不需要的层。隐藏或删除这些层更好吗

设置
layer.hidden=YES
vs
[layer removeFromSuperlayer]
当我希望它消失时

设置
layer.hidden=NO
vs
[superlayer addSublayer:layer]
当我想要它回来时

如果我隐藏了一个层,但为超层设置了动画,在动画过程中是否会因为子层被隐藏而不是被移除而影响性能?与添加/删除子层相比,该性能影响如何

父层与直接分层

使用单独的层的问题之一是现在我需要代码作为一个单元来管理它们。以前更改图层的位置非常简单,如
layer.position=newCoordinates。现在我需要做:

layer1.position = newCoordinates1;
layer2.position = newCoordinates2;
我决定对此进行简化,创建一个父层,并向其中添加layer1和layer2。我的主层现在可以只操作父层而不是单个层。我的父层还将处理要显示或隐藏的两个层中的哪个层的逻辑

然而,这现在引入了第三层(一开始我们有1层,现在有3层)。我很好奇,除了子层之外没有实际图形的层是否对性能有任何影响。与将这两个子层直接添加到超层相比,具有两个子层的空层基本上具有性能影响


任何指导都将不胜感激。

重绘单层与多个预绘层

这取决于你在这里怎么画。我假设您正在使用CALayer的DrawInText和一些自定义代码?如果是,如果每次更改缩放级别时不需要调用此图形代码,则肯定会有所帮助。 在这里,将层增加一倍所带来的内存占用应该不会对您造成伤害

隐藏与删除

我已经有相当一段时间在使用与您类似的设置,并且屏幕上同时有数百(数千)个Calayer。从我的实验中,我发现隐藏层对性能有很大的影响。对我来说,最好是完全删除它们,然后重新添加

这真的很令人沮丧,因为文档中没有提到这一点,而且通常你永远不会想到隐藏层会耗费(很多)性能

父层与直接分层

关于你的第三个问题:我不能百分之百确定作为两个层的父层的空层是否会影响性能,但我猜是这样的(根据我的经验,CA必须处理的每一个额外层都会导致它运行较慢)。 问题是:没有中间的一层,你能做到吗?你的图层是否有一定的顺序

您可以编写一个自定义类,将NSObject子类化,它接受两个层,并管理关于它们的一切(更改位置、从superlayer删除和添加等)。这样你们将有一个简单的界面,但并没有额外的层在屏幕上

如果这不是一个选项,您可以尝试使用CATTransferMLayer作为两个层的合成层。该层除了作为合成层(并且可以用于3D)之外,什么都不做。在您的场景中,这一个可能比“普通”CALayer需要更少的性能

一般性能adivce

如果可能,不要使用drawInContext绘制图层。如果可以的话,为你的明星使用CAShapeLayer,速度更快,抗锯齿效果也更好

请注意Xcode中内置的CPU计数器(而不是分析器)。在这里,您可以看到“其他进程”的CPU使用情况。在需要大量性能的CA应用程序中,“其他进程”部分基本上是CA RenderServer(BackboardDD)。在这里,您可以看到您的绘图现在需要多少CPU


否则,如果您担心内存使用情况,请查看分配分析器(这次是real profiler),并检查不同版本的代码(50层与100层)占用的内存量。

这是一个很好的建议,也是我一直在寻找的。我确实在使用带有一些自定义代码的drawInContext。画星星只是我的一个特别的例子。事实上,我们正在绘制更复杂的形状和文本。我很高兴听到我可以帮助你!:)您对交换邮件地址或skype ID感兴趣吗?也许你已经看到了我在CoreAnimation中面临的一些其他问题,反之亦然。当然。不确定交流联系信息的最佳方式是什么,但你可以在推特上给我@krunk4ever。
layer1.position = newCoordinates1;
layer2.position = newCoordinates2;