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

Смешивание В.С. offscreen-рендеринг, что хуже для производительности Core Animation?

Смешивание и рендеринг на экране являются дорогостоящими в Core Animation.

Их можно увидеть в инструменте Core Animation в инструментах с параметрами отладки: Instruments

Вот мой случай:

Отображение 50x50 изображений PNG на UIImageViews. Я хочу объединить изображения с 6-точечным радиусом. Первый способ - установить UIImageView.layer cornerRadius и masksToBounds, что приводит к экранированию. Второй способ - сделать копии изображений PNG с прозрачными углами, что вызывает смешение (из-за альфа-канала).

Я пробовал оба, но я не вижу существенной разницы в производительности. Тем не менее, я все еще хочу знать, что хуже в теории и лучших практиках, если таковые имеются.

Спасибо большое!

4b9b3361

Ответ 1

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

Во-первых, если вам нужны только ресурсы с одной кривой для закругленных углов (разные шкалы хороши, если желаемая кривизна одинакова), сохраните их таким образом, чтобы избежать дополнительного вычисления "cornerRadius" в во время выполнения.

Во-вторых, не используйте прозрачность там, где она вам не нужна (например, когда фон на самом деле является сплошным цветом) и всегда указывайте правильное значение для свойства "непрозрачного", чтобы помочь системе более эффективно рассчитать чертеж.

В-третьих, найдите способы минимизации размера прозрачных представлений. Например, для большого пограничного вида с прозрачными элементами (например, закругленные углы) рассмотрите разделение вида на 3 (верхний, средний, нижний) или 7 (4 угла, верхний средний, средний, нижний средний) части, сохраняя прозрачные части как можно меньше, и обозначать прямоугольные участки как непрозрачные, с сплошными фонами.

В-четвертых, в ситуациях, когда вы рисуете много текста в scrollViews (например, с помощью настраиваемого UITableViewCell), рассмотрите возможность использования метода "drawRect:", чтобы сделать эти части более эффективными. Продолжайте использовать subviews для элементов изображения, чтобы разделить время рендеринга между общим представлением между предварительным рисованием (subviews) и рисунком "точно в срок" (drawRect:). Очевидно, что экспериментирование (кадры в секунду при прокрутке) может показать, что нарушение этого "правила большого пальца" может быть оптимальным для ваших конкретных представлений.

Наконец, убедитесь, что у вас достаточно времени для экспериментов с использованием инструментов профилирования (особенно CoreAnimation). Я считаю, что легче всего увидеть улучшения, используя самое медленное устройство, на которое вы хотите настроить таргетинг, и результаты отлично смотрятся на новых устройствах.

Ответ 2

После просмотра видеороликов WWDC и экспериментов с Xcode и Instruments я могу сказать, что смешивание лучше, чем экранирование. Смешивание означает, что для вычисления цвета пикселей на прозрачных слоях требуется некоторое дополнительное время. Чем более прозрачные слои у вас есть (и больший размер этих слоев), тогда смешение занимает больше времени.

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

Также для внеэкранной системы рендеринга создается отдельный графический контекст и уничтожается после рендеринга.

Таким образом, вам следует избегать экранирования рендеринга и лучше заменить его смешением.