Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 提高CALayer过滤器的性能_Cocoa_Performance_Core Animation_Calayer_Core Image - Fatal编程技术网

Cocoa 提高CALayer过滤器的性能

Cocoa 提高CALayer过滤器的性能,cocoa,performance,core-animation,calayer,core-image,Cocoa,Performance,Core Animation,Calayer,Core Image,我正在开发一个Cocoa全屏应用程序。我使用的是具有多个子层的1NSView。现在进行测试-我正在使用任何按键向屏幕添加点(20 x 20)。这只是为了测试画点。我的问题是,我在我的点图层上使用了一个过滤器——特别是我使用的是CIDiscBlur——当我达到大约30个点时,点的绘制速度明显减慢。在按键和圆点出现之间可能有1-1.5秒的延迟。我注意到,如果我删除图层上的CIDisBlur过滤器设置,则不会出现减速 在绘制这么多子层时,我应该使用哪些最佳实践或技巧?任何帮助都会很好 CIFi

我正在开发一个Cocoa全屏应用程序。我使用的是具有多个子层的1
NSView
。现在进行测试-我正在使用任何按键向屏幕添加点(20 x 20)。这只是为了测试画点。我的问题是,我在我的点图层上使用了一个过滤器——特别是我使用的是
CIDiscBlur
——当我达到大约30个点时,点的绘制速度明显减慢。在按键和圆点出现之间可能有1-1.5秒的延迟。我注意到,如果我删除图层上的
CIDisBlur
过滤器设置,则不会出现减速

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

    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
查看这是否有帮助,但运气不好。

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

致以最良好的祝愿