我正在添加几个CALayers作为UIView层的子层。每层的内容是从服务器下载的不同图像。每个图层从屏幕外动画到随机生成的位置。图像数据是异步下载的。每幅图像约为300x300或更小。
作为随机放置的结果,层重叠,一些层被它们上面的层遮挡。这一切都很好。
我正在使用the answer to this question中的建议删除图层,因为它们会从视图中完全遮挡。确定覆盖率的计算发生在单独的线程上。
我有一个UIPanGestureRecognizer,允许用户在屏幕上拖动图层。
当添加的层数接近25-30并且逐渐变差时,我遇到了性能问题。动画变得不连贯并且通常完全不存在(新添加的层只是出现在它们的最终位置)。并且平移手势要么被忽略,要么导致所选图层的重新定位不稳定。
我假设我正在杀死GPU,所有层都重叠,另一层动画在上面?
有关如何提高性能的任何建议?
处理大量图层的最佳做法?
让图层在单独的view.layer中开始动画比以前添加的图层更好吗?
谢谢!
答案 0 :(得分:4)
要检查一些快速的事情。
运行Core Animation Instrument并查找不透明度。仅将图层的不透明标志设置为YES是不够的,如果底层图像具有alpha组件,则该层将考虑该值。
如果您从服务器获取的数据具有alpha,则应使用Quartz重绘并使用不包含alpha的新格式在本地保存文件。
确保您没有将100万像素图像放入100x100的图块中。同样是Core Animation Instrument,打开'Color Misaligned Images'并寻找黄色。
30到50层应该没问题。
答案 1 :(得分:3)
如果所有图层都不适合GPU的内存或内存的一部分,那么事情就会慢下来。据报道,与GPU内存中的合成层相比,加载和卸载GPU内存非常慢。您将不得不尝试此内存限制,因为较旧的设备可用的GPU内存比较新的设备少。