CoreAnimation: Чтобы изменить размер экземпляра CALayer, какой из них имеет лучшую производительность?трансформировать или границы? - PullRequest
0 голосов
/ 05 декабря 2011

Я знаю, что могу изменить размер экземпляра CALayer, изменив свойства bounds и transform.

Но какой из них имеет лучшую производительность? Или есть какой-то принцип, как выбрать подходящее свойство для использования?

1 Ответ

3 голосов
/ 06 декабря 2011

Это два разных свойства в том, как они взаимодействуют с CALayer, поэтому я не рассматриваю их как взаимозаменяемые.

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

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

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

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