【问题标题】:Improving Performance of CALayer Filters提高 CALayer 过滤器的性能
【发布时间】:2011-01-25 07:46:17
【问题描述】:

我正在开发一个 Cocoa 全屏应用程序。我正在使用 1 个 NSView 有 1 个 CALayer 有多个子层。现在进行测试 - 我正在使用任何击键将点 (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 看看是否有帮助 - 但没有运气。

【问题讨论】:

    标签: cocoa performance core-animation calayer core-image


    【解决方案1】:

    通过不使用圆角半径来制作圆形图层,您可能会获得性能提升。虽然在静态上下文中制作圆形图层是一个不错的小捷径,但在制作动画时,它会显着降低性能。您最好指定 CAShapeLayer 的圆形路径或下拉到 Core Graphics 并在 drawInContext 调用中绘制一个圆圈。要测试我是否正确,只需注释掉您设置角半径并应用过滤器的调用。看看这是否加快了速度。如果没有,那么我不确定发生了什么。这可能意味着您必须找到一种不同的方法来获得没有过滤器的效果。如果您的点始终具有相同的外观,您可能会通过使用图像来“作弊”。

    最好的问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多