嘿,我在NSScrollView中的层支持NSView中遇到了CALayers的性能问题。我有一个滚动视图,我填充了一堆CALayer实例,堆叠在下一个顶部。现在我正在做的就是在它们周围设置一个边框,这样我就能看到它们。图层中没有其他内容。
在滚动视图中我有大约1500左右的性能似乎很好。当我放入1500时,性能很好,因为我向下滚动列表,直到我到达项目1000.然后突然应用程序开始挂起。这不是一个逐渐放缓,这是我所期望的,如果它只是达到它的容量。这就像应用程序碰到了一堵砖墙。
当我在图层的绘制方法中调用CGContextFillRect时,减速发生在项目300周围。我假设这与视频卡内存填满或某事有关?在我的滚动视图中,当我们在屏幕外时,是否需要做一些事情来释放CALayers的资源?
我注意到如果我在我的图层上没有setNeedsDisplay,我可以在没有减速的情况下到达1500个项目的末尾。然而,这不是一个解决方案,因为我必须在图层中执行一些自定义绘图。我不确定这是否能解决问题,或者只是让它在图层中显示更多的项目。理想情况下,我希望在滚动视图中可以完全扩展数千个项目(理所当然)。实际上,我希望能够以这种方式显示多少这些空白项目?
#import "ShelfView.h"
#import <Quartz/Quartz.h>
@implementation ShelfView
- (void) awakeFromNib
{
CALayer *rootLayer = [CALayer layer];
rootLayer.layoutManager = self;
rootLayer.geometryFlipped = YES;
[self setLayer:rootLayer];
[self setWantsLayer:YES];
int numItemsOnShelf = 1500;
for(NSUInteger i = 0; i < numItemsOnShelf; i++) {
CALayer* shelfItem = [CALayer layer];
[shelfItem setBorderColor:CGColorCreateGenericRGB(1.0, 0.0, 0.0, 1.0)];
[shelfItem setBorderWidth:1];
[shelfItem setNeedsDisplay];
[rootLayer addSublayer:shelfItem];
}
[rootLayer setNeedsLayout];
}
- (void)layoutSublayersOfLayer:(CALayer *)layer
{
float y = 10;
int totalItems = (int)[[layer sublayers] count];
for(int i = 0; i < totalItems; i++)
{
CALayer* item = [[layer sublayers] objectAtIndex:i];
CGRect frame = [item frame];
frame.origin.x = self.frame.size.width / 2 - 200;
frame.origin.y = y;
frame.size.width = 400;
frame.size.height = 400;
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
[item setFrame:CGRectIntegral(frame)];
[CATransaction commit];
y += 410;
}
NSRect thisFrame = [self frame];
thisFrame.size.height = y;
if(thisFrame.size.height < self.superview.frame.size.height)
thisFrame.size.height = self.superview.frame.size.height;
[self setFrame:thisFrame];
}
- (BOOL) isFlipped
{
return YES;
}
@end
答案 0 :(得分:0)
我发现这是因为我用自定义绘图填充每一层,它们似乎都被缓存为单独的图像,即使它们共享了很多常见数据,所以我切换到只创建了十几个CALayers,填充它们“contents”属性,并将它们作为子图层添加到主图层。这似乎让事情变得更加轻松。