gpt4 book ai didi

ios - 为了性能,在 iOS 上隐藏或删除 CALayers 哪个更好?

转载 作者:可可西里 更新时间:2023-11-01 06:22:57 25 4
gpt4 key购买 nike

这与以下问题有关:How to improve performance of CALayer animations?

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

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

重绘单层与多个预绘层

我一直在尝试使用预先绘制的 2 个独立图层,当缩放更改时,我只隐藏一个图层并显示另一个图层,而不是在其中重绘一个图层。

p>
[layer configureWithZoom:zoom];
[layer setNeedsDisplay];

对比

layer1.hidden = (zoom == DEFAULT_ZOOM);
layer2.hidden = (zoom != DEFAULT_ZOOM);

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

隐藏与删除

鉴于上述情况,我现在拥有并非始终需要的图层。隐藏这些层还是移除它们更好?

设置 layer.hidden = YES vs [layer removeFromSuperlayer] 当我想让它消失时。

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

如果我隐藏一个层,但为 super 层设置动画,动画期间是否会因为子层被隐藏而不是移除而影响性能?与添加/删除子层相比,这种性能影响如何?

父层与直接分层

具有单独层的问题之一是现在我需要代码将它们作为一个单元进行管理。以前更改层的位置与 layer.position = newCoordinates; 一样简单。现在我需要做的是:

layer1.position = newCoordinates1;
layer2.position = newCoordinates2;

我决定简化它并创建一个父层并将 layer1 和 layer2 添加到其中。我的主层现在可以只操纵父层而不是单个层。我的父层还将处理显示或隐藏 2 个层中的哪一个的逻辑。

但是,这现在引入了第 3 层(开始时我们有 1 层,现在有 3 层)。我很好奇除了其子层之外没有实际绘图的层是否会对性能产生任何影响。与将这 2 个子层直接添加到 super 层相比,具有 2 个子层的空层基本上会影响性能。

如有任何指导,我们将不胜感激。

最佳答案

重绘单层与多个预绘层

这取决于你在这里如何绘制。我假设您正在使用 CALayer 的 drawInContext 和一些自定义代码?如果是,如果每次更改缩放级别时都不需要调用此绘图代码,那肯定会有所帮助。像以前一样有双层的内存占用真的不应该在这里伤害你。

隐藏与删除

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

这真的很令人沮丧,因为文档中没有提到它,而且通常您永远不会想到隐藏层会消耗(大量)性能。

父层与直接分层

关于你的第三个问题:我不能 100% 确定你的空层作为你的两个层的父层是否会影响性能,但我猜它是(根据我的经验,CA 拥有的每个额外层处理会导致它运行得更慢)。问题是:你能做到没有中间层吗?您的图层是否必须按特定顺序排列?

您可以编写一个自定义类,将 NSObject 子类化,它采用您的两层,并管理它们的所有内容(更改位置、从超层移除和添加等)。这样你就会有一个简单的界面,但屏幕上没有额外的层。

如果这不是一个选项,您可以尝试使用 CATransformLayer 作为两个图层的合成层。该层不做任何事情,只是一个用于合成的层(它可以用于 3D)。在您的场景中,这个 CALayer 的性能可能比“普通”CALayer 低。

一般性能建议

如果可能,不要使用drawInContext 来绘制图层。如果可以的话,为你的星星使用 CAShapeLayer,它会更快并且有很好的抗锯齿效果。

留意 Xcode 中内置的 CPU-meter(不是分析器)。在那里您可以看到“其他进程”的 CPU 使用率。在需要大量性能的 CA-Apps 中,这个“其他进程”部分基本上是 CA-RenderServer (backboardd)。在这里,您可以看到您的绘图当前占用了多少 CPU。

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

关于ios - 为了性能,在 iOS 上隐藏或删除 CALayers 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27850490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com