Термин «легкий» применительно к 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).
Когда дело доходит до уровня представления по сравнению с уровнем модели, растровое изображение не дублируется между ними.В данный момент на экране должна отображаться только одна растровая текстура.Различные слои просто отслеживают свойства и анимацию в любой момент, поэтому в каждом из них хранится очень мало информации.