2011-01-31 35 views
7

我添加了几个CALayers作为UIView图层的子图层。每层的内容是从服务器下载的不同图像。每个图层都从屏幕外移动到随机生成的位置。图像数据是异步下载的。每张图像大约为300x300或更小。CALayer优化?

随机放置的结果是,这些层重叠,有些被上面的层遮挡。这很好。

我除去层,因为它们使用建议在the answer to this question的计算以确定覆盖变得完全遮蔽从视野发生在一个单独的线程。

我有一个UIPanGestureRecognizer,允许用户在屏幕上拖动图层。

当添加的图层数量接近25-30并逐渐变差时,我遇到了性能问题。动画变得不稳定并且通常完全不存在(新添加的层仅出现在其最终位置)。而平移手势要么被忽略,要么导致选定图层重新定位不连续。

我想我正在杀死所有图层重叠并且上面有另一个图层动画的GPU?

有关如何提高性能的任何建议?

处理大量图层的最佳做法?

让图层在单独的view.layer中开始动画比先前添加的图层更好吗?

谢谢!

回答

4

几件快速检查。

运行核心动画工具并查找不透明度。只需将图层的不透明标志设置为YES是不够的,如果底层图像具有alpha分量,则图层将考虑此因素。

如果您从服务器获得的数据具有alpha值,那么您应该使用Quartz重新绘制并以不包含alpha的新格式在本地保存文件。

确保您不会将100万像素的图片放入100x100的图块中。还有核心动画工具,打开“颜色未对齐的图像”并寻找黄色。

30至50层应该没问题。

+0

谢谢比尔。我会给它一个镜头。当我提供layer.contents(仅在绘制图层时才使用)时,我的印象是不透明的被忽略了?阿尔法位将更加棘手 - 我在图像边缘周围使用2px宽的透明边框来平滑旋转边缘。关闭仪器! – TomH 2011-02-01 14:16:26

3

如果所有图层不适合GPU的内存或内存部分,事情会减慢很多。据报道,与GPU内存中的合成层相比,加载和卸载GPU内存相当慢。您必须尝试使用​​此内存限制,因为较旧设备的可用GPU内存少于较新设备。