2011-01-21 36 views
0

我正在开发一个Cocoa全屏应用程序。我正在使用1 NSView,其中有1 CALayer有多个子层。现在进行测试 - 我正在使用任何按键来在屏幕上添加点(20 x 20)。这仅仅是为了绘制点的测试。我的问题是,我在我的网点图层上使用了一个过滤器 - 具体来说,我使用的是CIDiscBlur - 一旦达到约30个点,点的绘制明显变慢。按键和点的外观之间可能有1 - 1.5秒的延迟。我注意到,如果我删除了在图层上设置CIDisBlur过滤器 - 没有减速。提高CALayer过滤器的性能

在绘制这么多子图层时,我应该使用哪些最佳实践或技巧?任何帮助都会很棒。

CIFilter *blurFilter = [CIFilter filterWithName:@"CIDiscBlur"]; 
    [blurFilter setDefaults]; 
    [blurFilter setValue:(id)[NSNumber numberWithFloat:15.0] forKey:@"inputRadius"]; 

    dotFilters = [[NSArray arrayWithObjects:(id)blurFilter, nil] retain]; 

    CGColorRef purpleColor = CGColorCreateGenericRGB(0.604, 0.247, 0.463, 1.0); 

    CALayer *dot = [[CALayer layer] retain]; 
    dot.backgroundColor = purpleColor; 
    dot.cornerRadius = 15.0f; 
    dot.filters = dotFilters; 

    NSRect screenRect = [[self.window screen] frame]; 

    // 10 point border around the screen 

    CGFloat width = screenRect.size.width - 20; 
    CGFloat height = screenRect.size.height - 20; 

    #define ARC4RANDOM_MAX  0x100000000 
    width = ((CGFloat)arc4random()/ARC4RANDOM_MAX) * width + 10; 
    height = ((CGFloat)arc4random()/ARC4RANDOM_MAX) * height + 10; 

    dot.frame = CGRectMake(width, height, 20,20);//30, 30); 


    [dot addSublayer:dotsLayer]; 

我也尝试使用masksToBounds = YES看看是否有帮助 - 但没有运气。

回答

1

通过不使用圆角半径来制作圆形图层,您可能会获得性能提升。虽然在静态环境中制作圆形图层是一个很好的小捷径,但在制作动画时,它会显着降低性能。你最好指定一个到CAShapeLayer的循环路径,或者直接下载到Core Graphics,然后在drawInContext调用中画一个圆。为了测试我是否正确,只需将您的电话注释掉即可设置角落半径并应用您的过滤器。看看这是否会加快速度。如果不是,那么我不确定发生了什么。这可能意味着你必须找到一种不用过滤器才能获得效果的方法。如果你总是对你的点有相同的外观,你可能可以通过使用图像“作弊”。

此致敬礼。