Подтвердить что ты не робот

CALayer - Тень вызывает удар производительности?

Итак, я делаю некоторые пользовательские анимации на моем навигационном контроллере и то, как он толкает и всплывает 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];

EDIT:

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

4b9b3361

Ответ 1

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

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

Ответ 2

self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;

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

Ответ 4

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