Таким образом, CALayer не содержит растровое изображение содержимого представления? - PullRequest
7 голосов
/ 29 ноября 2010

Из документов:

"Слои - это легкие объекты (CALayer), которые, хотя и похожи на представления, фактически являются модельными объектами, назначенными представлениям."

Легкийдля меня исключает любое тяжелое растровое изображение для контента.Я верил, что CALayer - это «настоящая» вещь, а UIView - просто оболочка вокруг него.Каждое представление имеет 3 слоя CAL в разных деревьях (модель, презентация, рендер).Так нет 3 битмапов?Только один?

Ответы [ 2 ]

17 голосов
/ 29 ноября 2010

Термин «легкий» применительно к CALayer происходит от той части документации, которая появилась на Mac.Как указывает Джо, NSView является довольно сложным элементом пользовательского интерфейса по сравнению с iPhone UIView.Вы можете анимировать десятки UIViews вокруг экрана даже на мобильном устройстве с ограниченными ресурсами, но NSViews значительно увеличивает нагрузку на систему, когда вы начинаете добавлять многие из них на экран.Это одна из вещей, которая была получена благодаря новому запуску UIKit поверх AppKit, потому что UIKit изначально имел Core Animation, и у Apple была возможность узнать, что сработало, а что нет в AppKit.

Для сравнения, CALayer очень мало добавляет к базовой растровой прямоугольной текстуре на основе графического процессора, которую он рисует, поэтому он не добавляет много накладных расходов.На iPhone это не сильно отличается от UIView, потому что тогда UIView - это просто легкая обертка вокруг CALayer.

Я собираюсь не согласиться с графом Чокула по этому поводу и сказать, что CALayerкажется, обернуть растровую текстуру на GPU.Да, вы можете указать собственный рисунок Quartz для создания содержимого слоя, но этот рисунок выполняется только при необходимости.После отрисовки содержимого в слое его не нужно перерисовывать, чтобы слой был перемещен или иным образом анимирован.Если вы примените преобразование к слою, то при увеличении вы увидите, что он будет иметь пикселизацию, что является признаком того, что он не имеет отношения к векторной графике.

Кроме того, со средой Core Plot (и в моем собственномприложения), нам пришлось отменить обычный процесс рисования CALayers, потому что обычный -renderInContext: подход не работал хорошо для PDF-файлов.Если вы используете это для рендеринга слоя и его подслоев в PDF, вы обнаружите, что слои представлены в окончательном формате растровыми растровыми изображениями, а не элементами вектора, какими они должны быть.Только с использованием другого пути рендеринга мы смогли получить правильный вывод для наших PDF-файлов.

Мне еще предстоит поиграть с новыми свойствами shouldRasterize и rasterizationScale в iOS 3.2, чтобы увидеть, если они изменятсякак это обрабатывается.

Фактически, вы обнаружите, что CALayers (и UIViews с их вспомогательными слоями) действительно потребляют много памяти, когда вы учитываете их растровое содержимое.«Легкий» показатель - это то, сколько они добавляют в верхней части содержимого, а это очень мало.Возможно, вы не увидите использования памяти в таком инструменте, как Object Allocations, но посмотрите на Memory Monitor, когда добавляете в приложение большие слои, и вы увидите скачки памяти в приложении или SpringBoard (которому принадлежит сервер Core Animation).

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

2 голосов
/ 29 ноября 2010

Как я понимаю, CALayer - это представление поверхности рисования Quartz. Вы не можете думать об этом с точки зрения растровых изображений, а скорее о контейнере, который инкапсулирует текущее состояние контекста рисования, включая его содержимое, преобразование, тени и так далее. По сути, он настолько близок, насколько вы можете добраться до графического процессора, оставаясь в Какао, но это не то же самое, что представление растрового изображения - скорее, он представляет всю информацию, необходимую для воспроизведения его содержимого в соответствии с указаниями. Так, например, если вы рисуете на нем линию, внутренний слой может просто передать координаты линии в графический процессор и позволить последнему нарисовать его, не беспокоясь о пикселях, необходимых для его визуализации.

По сравнению с UIView слой является «легковесным» в том смысле, что он связан исключительно с операциями отображения и не связан с такими вещами, как реагирование на события или касания и т. Д.

Причиной наличия как слоя модели, так и уровня представления является то, что последний представляет текущее состояние слоя с учетом всех анимаций. Вот почему, например, в документации рекомендуется проводить тестирование на соответствие уровню представления.

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