Tol*_*Hon 3 performance calayer ios
这与以下问题有关:如何提高CALayer动画的性能?
我目前有一个可以有几百个CALayers的视图.我知道有很多CALayers会导致性能下降受到处理器的限制,但我想知道是否有人在那里尝试了以下几种方法并且可以提供指导.
为了更好地了解我正在尝试做什么,想象一下我的图层上有一个点.当我放大时,我希望点成为一个明星.当我缩小时,我希望明星重新成为一个点.现在想象我有数百个这样的点.
重绘单个图层与多个预先绘制的图层
我不是在缩放变化时重绘一个单独的图层,而是一直在尝试预先绘制2个单独的图层,当缩放发生变化时,我只是隐藏一个并显示另一个.
[layer configureWithZoom:zoom];
[layer setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)
VS
layer1.hidden = (zoom == DEFAULT_ZOOM);
layer2.hidden = (zoom != DEFAULT_ZOOM);
Run Code Online (Sandbox Code Playgroud)
据我所知,拥有一堆图层会增加我的内存占用量,如果之前有50层,我现在有100层.但就性能而言,这会有帮助吗?
隐藏与删除
鉴于上述情况,我现在拥有一直不需要的图层.隐藏这些图层或删除它们会更好吗?
设置layer.hidden = YESvs [layer removeFromSuperlayer]当我希望它消失.
设置layer.hidden = NOvs [superlayer addSublayer:layer]我希望它回来的时候.
如果我隐藏一个图层,但是为超级图层设置动画,是否会在动画期间出现性能损失,因为隐藏了一个子图层而不是删除它?与添加/删除子图层相比,该性能如何?
父层与直接分层
现在我需要使用代码将它们作为一个单元进行管理.以前更改图层的位置非常简单layer.position = newCoordinates;.现在我需要这样做:
layer1.position = newCoordinates1;
layer2.position = newCoordinates2;
Run Code Online (Sandbox Code Playgroud)
我决定简化这个并创建一个父层,并为它添加layer1和layer2.我的主图层现在可以只操纵父图层而不是单个图层.我的父图层还将处理要显示或隐藏的2个图层中的哪个图层的逻辑.
然而,这现在引入了第3层(在开始时我们有1,现在我们有3).我很好奇,除了子层之外没有实际绘图的图层对性能有任何影响.基本上,与将这2个子层直接添加到超级层相比,具有2个子层的空层具有性能损失.
任何指导将不胜感激.
重绘单个图层与多个预先绘制的图层
这取决于你如何在这里画画.我假设您正在使用CALayer的drawInContext和一些自定义代码?如果是,如果每次更改缩放级别时都不需要调用此绘图代码,这肯定会有所帮助.像以前一样拥有双层的内存占用真的不应该伤到你.
隐藏与删除
我现在正在使用与你类似的设置很长一段时间,并且在屏幕上同时拥有数百(数千)个CALayers.从我的实验中我发现隐藏层有很大的性能影响.对我来说,最好在以后完全删除并重新添加它们.
这真的令人沮丧,因为它在文档中没有说到,并且通常你永远不会认为隐藏层会花费很多(很多)性能.
父层与直接分层
关于你的第三个问题:我不是百分之百确定你的两层作为父级的空层是否会受到性能影响,但我猜它是(从我的经验来看,CA必须处理的每一个额外的层都会导致它运行得慢一些).问题是:你能否在没有介于两者之间的情况下做到这一点?你的图层必须有一定的顺序吗?
您可以编写一个自定义类,子类化NSObject,它将占用您的两个层,并管理有关它们的所有内容(更改位置,从超级层中删除和添加等).这样你就可以有一个简单的界面,但屏幕上没有额外的图层.
如果这不是一个选项,您可以尝试使用CATransformLayer作为两层的合成层.此图层不会执行任何操作,只能作为合成图层(并且可以用于3D).在你的场景中,这可能比"普通"CALayer的性能要低.
一般表现adivce
如果可能,请不要使用drawInContext绘制图层.如果可以的话,使用CAShapeLayer作为你的星星,它会更快,并且具有很好的抗锯齿效果.
看看Xcode内置的CPU表(不是分析器).在那里你可以看到"其他进程"的CPU使用情况.在需要大量性能的CA-Apps中,这个"其他进程"部分基本上是CA-RenderServer(背板).在这里,您可以看到您的绘图成本现在多少CPU.
否则,如果您担心内存使用情况,请查看分配探查器(这次是真正的探查器),并检查代码的不同版本(50对100层)占用多少内存.