Смешивание VS offscreen-рендеринга, что хуже для производительности Core Animation? - PullRequest
12 голосов
/ 21 октября 2011

Смешивание и рендеринг за кадром обходятся дорого в Core Animation.

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 26 января 2012

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

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

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

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

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

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

4 голосов
/ 01 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...