CALayer - тень наносит удар по производительности? - PullRequest
29 голосов
/ 03 апреля 2012

Так что я делаю некоторые пользовательские анимации на моем навигационном контроллере, и как он толкает и выдает viewControllers.

Все работает гладко.Как только я добавлю следующий код (в подкласс UINavigationController), я столкнусь с огромным ударом по производительности.После добавления тени все анимации становятся очень медленными.Это ожидалось или я что-то не так делаю в коде?

// This code gets called once during NavigationController initialization.
[self.view setClipsToBounds:NO];
[self.view.layer setCornerRadius:5];
[self.view.layer setShadowOffset:CGSizeMake(0, 20)];
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]];
[self.view.layer setShadowRadius:20.0];
[self.view.layer setShadowOpacity:1];

РЕДАКТИРОВАТЬ:

Изменил радиус тени на 1, и он все еще медленный

Ответы [ 4 ]

84 голосов
/ 30 апреля 2012
self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;

Недавно у меня были некоторые проблемы с медленными тенями CALayer, и эта простая строка кода все исправила для меня!

49 голосов
/ 03 апреля 2012

Вы должны ожидать замедления от добавления тени.shadowRadius из 20 очень высоко и будет особенно медленным.

Другой ключ для улучшения скорости рендеринга теней: установите свойство shadowPath.Это может помочь значительно.

15 голосов
/ 04 марта 2013

Использование shadowPath вместо shadowOffset.

theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath;

Проверьте это сообщение: iphone - производительность анимации очень низкая при включенной тени просмотра

2 голосов
/ 03 апреля 2012

Да, тени очень дорогие (особенно такие большие тени - играйте с радиусом, и вы заметите, что это существенно меняет степень замедления, которое вы испытываете).Один из способов повысить производительность - это визуализировать его один раз в CGImageContext и просто отобразить это изображение вместо того, чтобы слой повторно отображал тень каждый раз, когда он перерисовывает (но это не работает, если тень нужно анимировать или что-то еще).

...