为了性能,在 iOS 上隐藏或删除 CALayers 哪个更好?
For performance, is it better to hide or remove CALayers on iOS?
这与以下问题有关:How to improve performance of CALayer animations?
我目前有一个视图可以有几百个 CALayer。我知道有很多 CALayer 会导致处理器限制性能下降,但我想看看是否有人尝试过以下几种方法并可以提供指导。
为了更好地让您了解我正在尝试做什么,假设我在图层上画了一个点。当我放大时,我想让这个点变成一颗星星。当我缩小时,我希望星星变回一个点。现在想象一下,我有数百个这样的点。
重绘单层 vs 多个预绘层
我一直在尝试使用预先绘制的 2 个独立图层,而不是在缩放更改时重绘 1 个图层,当缩放更改时,我只是隐藏一个图层并显示另一个图层。
[layer configureWithZoom:zoom];
[layer setNeedsDisplay];
对
layer1.hidden = (zoom == DEFAULT_ZOOM);
layer2.hidden = (zoom != DEFAULT_ZOOM);
我知道有一堆层会增加我的内存占用,如果我以前有 50 层,我现在有 100 层。但就性能而言,这会有帮助吗?
隐藏与删除
鉴于以上情况,我现在拥有并非始终需要的图层。隐藏这些层还是删除它们更好?
当我想让它消失时设置 layer.hidden = YES
与 [layer removeFromSuperlayer]
。
设置 layer.hidden = NO
与 [superlayer addSublayer:layer]
当我想要它回来时。
如果我隐藏了一个图层,但为超级图层设置了动画,动画期间是否会因为子图层被隐藏而不是移除而影响性能?与 adding/removing 子层相比,该性能如何?
父层与直接分层
具有单独层的问题之一是现在我需要代码将它们作为一个单元来管理。以前更改图层的位置就像 layer.position = newCoordinates;
一样简单。现在我需要做的是:
layer1.position = newCoordinates1;
layer2.position = newCoordinates2;
我决定简化它并创建一个父层并将 layer1 和 layer2 添加到其中。我的主层现在可以只操纵父层而不是单个层。我的父层还将处理显示或隐藏两层中哪一层的逻辑。
但是,这现在引入了第 3 层(开始时我们有 1 层,现在有 3 层)。我很好奇除了其子层之外没有实际绘图的层是否会对性能产生任何影响。与将这 2 个子层直接添加到超级层相比,具有 2 个子层的空层基本上会影响性能。
如有任何指导,我们将不胜感激。
重绘单层 vs 多个预绘层
这里要看你怎么画了。我假设您正在使用 CALayer 的 drawInContext 和一些自定义代码?如果是,如果每次更改缩放级别时都不需要调用此绘图代码,那肯定会有所帮助。
像以前一样有双层的内存占用真的不应该在这里伤害你。
隐藏与删除
我使用与您类似的设置已经有一段时间了,并且在屏幕上同时有数百(数千)个 CALayer。从我的实验中,我发现隐藏层对性能有巨大的影响。对我来说,最好完全删除并稍后重新添加它们。
这真的很令人沮丧,因为它在文档中没有任何地方提到,而且通常你永远不会想到隐藏层会花费(很多)性能。
父层与直接分层
关于你的第三个问题:我不能 100% 确定你的空层作为你的两个层的父层是否会影响性能,但我猜它是(根据我的经验,每一个额外的层都会CA 必须处理导致它 运行 变慢)。
问题是:你能做到没有中间层吗?您的图层是否必须按特定顺序排列?
您可以编写一个自定义 class、subclassing NSObject,它采用您的两层,并管理关于它们的所有内容(更改位置、从超级层删除和添加等)。这样你就会有一个简单的界面,但屏幕上没有额外的层。
如果这不是一个选项,您可以尝试使用 CATransformLayer 作为两个图层的合成层。该层不做任何事情,只是一个用于合成的层(它可以用于 3D)。在您的场景中,这可能比 "normal" CALayer 的性能低。
一般性能建议
如果可能,请不要使用 drawInContext 绘制图层。如果可以的话,为你的星星使用 CAShapeLayer,它会更快并且有很好的抗锯齿。
继续查看 Xcode 中内置的 CPU-meter(不是分析器)。您会看到 CPU-"other processes" 的用法。在需要大量性能的 CA-Apps 中,这个 "other processes" 部分基本上是 CA-RenderServer (backboardd)。在这里,您可以看到您现在的绘图费用 CPU。
否则,如果您担心内存使用情况,请检查分配分析器(这次是真正的分析器)并检查不同版本的代码(50 层与 100 层)占用多少内存。
这与以下问题有关:How to improve performance of CALayer animations?
我目前有一个视图可以有几百个 CALayer。我知道有很多 CALayer 会导致处理器限制性能下降,但我想看看是否有人尝试过以下几种方法并可以提供指导。
为了更好地让您了解我正在尝试做什么,假设我在图层上画了一个点。当我放大时,我想让这个点变成一颗星星。当我缩小时,我希望星星变回一个点。现在想象一下,我有数百个这样的点。
重绘单层 vs 多个预绘层
我一直在尝试使用预先绘制的 2 个独立图层,而不是在缩放更改时重绘 1 个图层,当缩放更改时,我只是隐藏一个图层并显示另一个图层。
[layer configureWithZoom:zoom];
[layer setNeedsDisplay];
对
layer1.hidden = (zoom == DEFAULT_ZOOM);
layer2.hidden = (zoom != DEFAULT_ZOOM);
我知道有一堆层会增加我的内存占用,如果我以前有 50 层,我现在有 100 层。但就性能而言,这会有帮助吗?
隐藏与删除
鉴于以上情况,我现在拥有并非始终需要的图层。隐藏这些层还是删除它们更好?
当我想让它消失时设置 layer.hidden = YES
与 [layer removeFromSuperlayer]
。
设置 layer.hidden = NO
与 [superlayer addSublayer:layer]
当我想要它回来时。
如果我隐藏了一个图层,但为超级图层设置了动画,动画期间是否会因为子图层被隐藏而不是移除而影响性能?与 adding/removing 子层相比,该性能如何?
父层与直接分层
具有单独层的问题之一是现在我需要代码将它们作为一个单元来管理。以前更改图层的位置就像 layer.position = newCoordinates;
一样简单。现在我需要做的是:
layer1.position = newCoordinates1;
layer2.position = newCoordinates2;
我决定简化它并创建一个父层并将 layer1 和 layer2 添加到其中。我的主层现在可以只操纵父层而不是单个层。我的父层还将处理显示或隐藏两层中哪一层的逻辑。
但是,这现在引入了第 3 层(开始时我们有 1 层,现在有 3 层)。我很好奇除了其子层之外没有实际绘图的层是否会对性能产生任何影响。与将这 2 个子层直接添加到超级层相比,具有 2 个子层的空层基本上会影响性能。
如有任何指导,我们将不胜感激。
重绘单层 vs 多个预绘层
这里要看你怎么画了。我假设您正在使用 CALayer 的 drawInContext 和一些自定义代码?如果是,如果每次更改缩放级别时都不需要调用此绘图代码,那肯定会有所帮助。 像以前一样有双层的内存占用真的不应该在这里伤害你。
隐藏与删除
我使用与您类似的设置已经有一段时间了,并且在屏幕上同时有数百(数千)个 CALayer。从我的实验中,我发现隐藏层对性能有巨大的影响。对我来说,最好完全删除并稍后重新添加它们。
这真的很令人沮丧,因为它在文档中没有任何地方提到,而且通常你永远不会想到隐藏层会花费(很多)性能。
父层与直接分层
关于你的第三个问题:我不能 100% 确定你的空层作为你的两个层的父层是否会影响性能,但我猜它是(根据我的经验,每一个额外的层都会CA 必须处理导致它 运行 变慢)。 问题是:你能做到没有中间层吗?您的图层是否必须按特定顺序排列?
您可以编写一个自定义 class、subclassing NSObject,它采用您的两层,并管理关于它们的所有内容(更改位置、从超级层删除和添加等)。这样你就会有一个简单的界面,但屏幕上没有额外的层。
如果这不是一个选项,您可以尝试使用 CATransformLayer 作为两个图层的合成层。该层不做任何事情,只是一个用于合成的层(它可以用于 3D)。在您的场景中,这可能比 "normal" CALayer 的性能低。
一般性能建议
如果可能,请不要使用 drawInContext 绘制图层。如果可以的话,为你的星星使用 CAShapeLayer,它会更快并且有很好的抗锯齿。
继续查看 Xcode 中内置的 CPU-meter(不是分析器)。您会看到 CPU-"other processes" 的用法。在需要大量性能的 CA-Apps 中,这个 "other processes" 部分基本上是 CA-RenderServer (backboardd)。在这里,您可以看到您现在的绘图费用 CPU。
否则,如果您担心内存使用情况,请检查分配分析器(这次是真正的分析器)并检查不同版本的代码(50 层与 100 层)占用多少内存。