移动时禁用CALayer内容的重绘(iphone)

移动时禁用CALayer内容的重绘(iphone),iphone,core-animation,quartz-graphics,calayer,Iphone,Core Animation,Quartz Graphics,Calayer,我有一个包含大量Calayer(~1000)的UIView,每个Calayer都有一个小图像作为其内容。此UIView是scrollview的子视图(实际上它是另一个视图的子视图,该视图是scrollview的子视图)。这在开始时绘制得相对较快(几秒钟)。但是,当我在scrollview中滚动时,帧速率非常低 是否每次我滚动时都试图重新绘制每个CALayer的内容?有没有办法禁用此功能?还有别的事吗 注意:我在UIView中将ClearContextBeforeDrawing设置为NOo,这有所

我有一个包含大量Calayer(~1000)的UIView,每个Calayer都有一个小图像作为其内容。此UIView是scrollview的子视图(实际上它是另一个视图的子视图,该视图是scrollview的子视图)。这在开始时绘制得相对较快(几秒钟)。但是,当我在scrollview中滚动时,帧速率非常低

是否每次我滚动时都试图重新绘制每个CALayer的内容?有没有办法禁用此功能?还有别的事吗


注意:我在UIView中将ClearContextBeforeDrawing设置为NOo,这有所帮助,但仍然比我预期的要慢得多

将图层上的
NeedsDisplaynBoundSchange
属性设置为

[layer setNeedsDisplayOnBoundsChange:NO];

这些层不应该被重新绘制,但它们将使用GPU合成。尝试在instruments中使用Sampler和OpenGL ES instruments,看看您的瓶颈是否在CPU或GPU中。您可以通过点击仪器名称旁边的“i”并选择额外参数(平铺器利用率、渲染器利用率等),在OpenGL ES仪器中记录额外的细节。如果其中一个OpenGL值接近100%,那么阻碍您的是合成。但是,如果采样器显示了对-drawRect:或类似方法的大量调用,那么您的层将被重新绘制(出于某种原因),这可能就是问题所在


此外,您还可以使用Core Animation instrument为非不透明层上色,这样可以降低显示帧速率。

谢谢,但这不行。我不确定滚动视图时滚动视图子视图的边界是否会改变。谢谢。我会看看我是否能找出堆肥步骤是否是瓶颈。我猜是的。你对如何加快这个阶段有什么想法吗。当我滚动时,我不需要它重新组合-有没有一种方法可以禁用合成,然后在必要时手动重新组合(即,仅当其中一个图层内容发生实际更改时)?要加快合成速度,请尽可能使用不透明图层。此外,您还可以在滚动过程中添加和删除屏幕上出现的子层。层中的图像是否是通过变换缩放的较大图像?如果是这样的话,您可能希望预先缩放图像,并且只缩放您需要的精确大小。转换也会导致性能的轻微下降。为什么需要这么多层呢?当图层在视图内/视图外滚动时,是否可以删除/添加图层?(1000层相当多)