嘿,我在 NSScrollView 内的支持 NSView 的层中遇到了 CALayers 的性能问题。我有一个滚动视图,其中填充了一堆 CALayer 实例,将一个堆叠在下一个之上。现在我所做的就是在它们周围设置一个边框,这样我就可以看到它们。该层中没有其他内容。
在滚动视图中有大约 1500 个左右之前,性能似乎还不错。当我输入 1500 时,当我向下滚动列表时,性能非常好,直到我到达项目 1000 左右。然后应用程序突然开始挂起。这不是逐渐放缓,如果它刚刚达到其容量,这是我所期望的。这就像应用程序撞到了一堵砖墙。
当我在图层的绘制方法中调用 CGContextFillRect 时,减速发生在项目 300 附近。我假设这可能与视频卡内存已满或其他有关?当 CALayers 在我的滚动视图中离开屏幕时,我需要做些什么来释放它们的资源吗?
我注意到,如果我不在我的图层上设置需要显示,我可以在没有减速的情况下完成 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