我有一个带有大量CALayers(~1000)的UIView,每个CALayers都有一个小图像作为其内容。这个UIView是一个scrollview的子视图(实际上它是另一个视图的子视图,它是scrollview的子视图)。这开始相对较快(几秒钟)。但是,当我滚动滚动视图时,帧速率非常低。
每次滚动时,它是否都在尝试重绘每个CALayer的内容?有没有办法禁用它?还有别的事吗?
注意:我将clearsContextBeforeDrawing设置为我的UIView,这有点帮助,但它仍然比我预期的要慢很多
答案 0 :(得分:2)
不应重绘图层,但是它们将使用GPU进行合成。尝试使用Instruments中的Sampler和OpenGL ES仪器来查看您的瓶颈是否在CPU或GPU中。您可以通过点击仪器名称旁边的“i”并选择额外参数(Tiler利用率,渲染器利用率等)来记录OpenGL ES仪器中的额外细节。如果其中一个OpenGL值接近100%,那么它就是阻止你的合成。但是,如果采样器显示了对-drawRect:或类似方法的大量调用,那么您的图层将被重绘(由于某种原因),这可能是问题所在。
此外,您可以使用Core Animation工具为非不透明图层着色,这会降低显示帧率。
答案 1 :(得分:0)
将图层上的needsDisplayOnBoundsChange
属性设置为NO
:
[layer setNeedsDisplayOnBoundsChange:NO];