Улучшение производительности фильтров Cameer
-
15-10-2019 - |
Вопрос
Я работаю над полноэкранированным приложением какао. Я использую 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. Чтобы проверить, если я прав, просто прокомментируйте свой звонок, чтобы установить радиус углового радиуса и применить свой фильтр. Посмотрите, ускоряет ли это. Если нет, то я не уверен, что случилось. Это может означать, что вам придется найти другой способ получить свой эффект без фильтра. Если у вас всегда будет один и тот же взгляд на ваши точки, вы, вероятно, сможете «обмануть», используя изображение.
С наилучшими пожеланиями.