Оптимизировать Core Graphics анимированный рисунок (iPhone) - PullRequest
3 голосов
/ 22 июля 2010

У меня есть цикл, который запускает функцию 30 раз в секунду.Функция меняет положение пары точек, которые я использую для анимации.Я рисую линии через все точки, это означает, что линии будут меняться 30 раз в секунду.

Я рисую эти линии в CGLayer, который затем рисуется в UIView в методе drawRect :.Я делаю это потому, что понимаю, что при рисовании вне экрана улучшается производительность.Однако, похоже, что CGLayer сохраняет все фактические линии вместо нарисованных пикселей, поскольку, даже если я очищу его, программа будет работать все медленнее и медленнее с течением времени, когда будет нарисовано больше линий.оживить это.Какой самый эффективный способ и почему?

Ответы [ 2 ]

4 голосов
/ 22 июля 2010

Если у вас есть путь для анимации от штата к штату, я настоятельно рекомендую посмотреть CAShapeLayer . Этот тип слоя позволяет вам указать два пути (с одинаковым количеством контрольных точек) и плавно анимировать их, используя Core Animation.

Две хорошие статьи на эту тему: "Походные муравьи с базовой анимацией" Мэтта Лонга и "Комплексная интерполяция с CAShapeLayer (Free)" Джо Ричиоппо.

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

4 голосов
/ 22 июля 2010

Вы должны использовать Core Animation Framework для анимации свойств на слое. Вы можете либо создать подкласс CALayer, либо использовать делегата для выполнения фактического рисования. В коде чертежа вы можете получить доступ к свойству, которое интерполируется, и использовать его для перемещения точек, изменения толщины линий или чего-либо еще, что Core Graphics позволяет вам контролировать. Посмотрите на этот пример кода от Apple и посмотрите, как он использует анимируемое значение lineWidth.

Этот небольшой урок от Джона Блэкберна - одно из моих любимых введений в Core Animation. Есть несколько различных концепций, но в целом довольно просто создавать довольно сложные анимации.

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

...