Плохая производительность при анимации ядра и поворотах вида: как улучшить? - PullRequest
0 голосов
/ 25 мая 2009

У меня 12 видов, которые я поворачиваю почти аналогично значкам на домашнем экране, когда перехожу в режим homescreen-customization-mode, касаясь значка в течение нескольких секунд.

Я использую код 3D-преобразования для выполнения поворотов. Каждый из них имеет продолжительность всего 0,02 секунды, а угол и направление вращения постоянно изменяются при измерениях ускорения.

5 из этих представлений хороши, но 12 имеют очень плохую производительность. Вот код вращения:

CATransform3D rotatedTransform = CATransform3DRotate(CATransform3DIdentity, degrees * M_PI / 180.0, 0.0f, 0.0f, 1.0f);
self.layer.transform = rotatedTransform;

вокруг него обернута какая-то основная анимация. Но я вижу здесь трату процессорного времени, так как я не делаю 3D-вещи. Я действительно только вращаю 2D и ничего больше. Это простые UIImageViews, но пользовательский класс, который выполняет анимацию вращения самостоятельно.

Я слышал, что есть «аффинные» преобразования, которые должны работать для 2D-пространства. Вы бы посоветовали изменить это на 2D в этом случае?

Должен ли я предпочесть изменить преобразование слоя или вида? что быстрее?

Ответы [ 4 ]

2 голосов
/ 28 мая 2009
  1. Акула это. Вы должны знать, что именно медленно, чтобы продолжить.

  2. Попробуйте увеличить интервал обновления с 0,02 с до 0,1 с; это приемлемо?

  3. Если все изображения вращаются вместе, используйте sublayerTransform на суперслое вместо преобразования каждого по отдельности

  4. Попробуйте отключить анимацию, чтобы убедиться, что ваши обратные вызовы работают так, как вы ожидаете (setDisableActions: on CATransaction) Видите ли вы то же самое, что и медлительность в Shark, когда вы их отключили?

  5. Если вы делаете это в виде прокрутки, у вас могут быть другие проблемы. Вам нужно будет позаботиться о том, чтобы происходило включение / выключение экрана и т. Д.

  6. 3d-преобразования имеют ту же скорость, что и аффинные в базовой анимации AFAIK. основные вещи типа sin / cos не замедляют работу приложения

Дополнительная информация о фактическом эффекте, который вы пытаетесь достичь, действительно поможет повысить производительность.

Насколько велики на экране изображения?

1 голос
/ 07 июня 2009

Вращения CALayer с аппаратным ускорением, 2D и 3D преобразования будут очень похожи, никаких перерисовок не происходит, нет необходимости переходить в opengl, нет необходимости кэшировать.

Акула поможет, но вам нужно знать, что вы ищете, и что вы ищете, это не улучшение производительности вашего текущего кода, а полное удаление кода.

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

Таким образом, стратегия заключается в том, чтобы найти способ заставить CA выполнять работу и перезванивать вам менее 50 раз в секунду.

Как насчет CAAnimationGroup, содержащего несколько CAPropertyAnimation для каждого из ваших слоев и настройки, скажем, по одной секунде анимации за раз?

Как только вы передадите это в CA, CA воспроизведет его в своем собственном потоке.

1 голос
/ 25 мая 2009

Мой совет - перейти на OpenGL ES.


Хотя Core Animation немного быстрее, чем «UITransformations», проблема, с которой вы сталкиваетесь, является классической: вы пытаетесь создать покадровое действие с множеством «виртуальных» спрайтов, плавающих вокруг. Это не то, что UIKit предназначен для . Особенно анимации, которые вы пытаетесь сделать. Вращение требует тригонометрии для вычисления интерполяции пикселей. Это довольно дорогая процедура.

Если нет четких ограничений на интенсивность анимации, количество анимаций объектов в то же время и частоту пересчета новых преобразований, Мой единственный совет для вас на данный момент - OpenGL ES .

Мой опыт работы с iPhone был довольно похожим . Каждый раз, когда мы создавали приложение, текущая платформа не могла справиться с этим. Мы закончили с использованием OpenGL ES, и это того стоит. Производительность невероятна .

Прошу прощения за "плохие новости", но Я настоятельно рекомендую не использовать UIKit и Core Animation для приложений, основанных на кадрах .

0 голосов
/ 25 мая 2009

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

...