Улучшение производительности CALayer Filters - PullRequest
0 голосов
/ 21 января 2011

Я работаю над полноэкранным приложением Cocoa. Я использую 1 NSView, который имеет 1 CALayer, который имеет несколько подслоев. Прямо сейчас для тестирования - я использую любые нажатия клавиш, чтобы добавить точки (20 х 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, чтобы посмотреть, помогло ли это - но не повезло.

1 Ответ

1 голос
/ 25 января 2011

Вероятно, вы можете получить прирост производительности, не используя угловой радиус для создания круглых слоев.Несмотря на то, что это хороший маленький ярлык для создания круглого слоя в статическом контексте, при анимации это значительно ухудшит производительность.Было бы лучше указать круговой путь к CAShapeLayer или перейти к Core Graphics и просто нарисовать круг в вызове drawInContext.Чтобы проверить, прав ли я, просто закомментируйте ваш звонок, чтобы установить угловой радиус и применить фильтр.Посмотри, не ускоряет ли это все.Если нет, то я не уверен, что случилось.Это может означать, что вам придется искать другой способ получить эффект без фильтра.Если вы всегда будете одинаково смотреть на свои точки, вы, вероятно, сможете «обмануть», используя изображение.

С уважением.

...