Вопрос

Я работаю над полноэкранированным приложением какао. Я использую 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 Чтобы увидеть, помогло ли это - но не повезло.

Это было полезно?

Решение

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

С наилучшими пожеланиями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top