У меня плохая производительность при использовании эффекта тени - PullRequest
10 голосов
/ 18 июня 2011

Я поместил некоторые виды изображений в режим прокрутки.И когда я перетаскивал это представление прокрутки, у меня не было никаких проблем.

Но после того, как я применил эффект тени к этим представлениям изображения, перетаскивание этого представления прокрутки имеет плохую производительность.

Я использовал shadowOpacity, shadowRadius и shadowOffset.

ex:

[ [ anImageView layer ] shadowOpacity: 1.0 ];

Если использование эффекта тени серьезно ухудшает производительность, я буду рисовать тени изображений напрямую.

Если естьНесколько советов по этой проблеме, пожалуйста, дайте мне знать.

Я хочу использовать эффект тени на iOS программно, потому что у меня худший навык рисования.

Спасибо за чтение.

Ответы [ 4 ]

25 голосов
/ 18 июня 2011

См. CALayer.shouldRasterize (iOS 3.2+, но также как и shadowOffset / etc):

Когда значение этого свойства равно YES, слой отображается как растровое изображение в его локальном координатном пространстве, а затем компоновывается в место назначения с любым другим содержимым. Эффекты тени и любые фильтры в свойстве filters растеризуются и включаются в растровое изображение.

Возможно, вы также хотите правильно настроить растеризацию Scale.

8 голосов
/ 29 апреля 2012

Хотя использование восстановленного слоя действительно увеличивает производительность, вы получите лучшие (более приятные) результаты, используя теневой путь, как подсказывает @ wayne-hartman.

Проверка http://nachbaur.com/blog/fun-shadow-effects-using-custom-calayer-shadowpaths о том, как использовать CALayerтеневой путь.

7 голосов
/ 04 января 2013

Всякий раз, когда вы работаете с тенями, лучше использовать путь Безье в качестве фона.Это поможет вам установить shadowPath, что значительно улучшит производительность.Растеризация улучшит производительность, но setShadowPath улучшит в 5 раз больше, чем просто установка растеризации.

path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) cornerRadius:10];
[self.layer setShadowColor:[UIColor blackColor].CGColor];
[self.layer setShadowOpacity:1.0f];
[self.layer setShadowRadius:10.0f];
[self.layer setShadowPath:[path CGPath]];
1 голос
/ 18 июня 2011

У меня была точно такая же проблема. Рисование тени является довольно дорогостоящей многопроходной операцией, поэтому я могу понять ее, и думаю, что тень рисуется непрерывно при прокрутке. Единственный обходной путь, который я нашел, - это визуализация тени вручную в изображение и отображение этого изображения за изображениями в свитке. Кажется, это хорошо работает.

...