Выжимая чуть больше производительности из Core Animation - PullRequest
2 голосов
/ 29 октября 2010

У меня есть игра, в которой движется не более 10 маленьких анимированных UIImageViews, максимум.Я управляю их анимацией с помощью таймера CADisplay, работающего со скоростью 60 кадров в секунду.Вот пример того, как я перемещаю представления в моем методе обновления:

// for each insect in insectArray
insectView.center = insect.hitCenter // I pull a position from my model object

Графика - 32 x 32 пикселя с максимум 5 кадрами анимации каждый, если это помогает.У них есть альфа-канал для прозрачности.Я профилировал и исключил любые внутриигровые вычисления как узкое место.Я также сделал свойство opacity = YES для очень небольшого ускорения.Воспроизводить анимированные кадры или нет - не имеет значения.

Частота кадров в основном отличная, за исключением старых устройств, таких как iPhone 1G и 3G.Там я получаю прерывистое заикание.

Перед переключением на OpenGL , есть ли какой-либо способ получить немного больше производительности?

Ответы [ 3 ]

1 голос
/ 07 ноября 2010

Я испытал такое же узкое место с CoreAnimation; она очень ограничена с точки зрения сложности системы, которую вы можете отобразить с приличной производительностью. Из того, что я читал и обсуждал с другими, там нет серебряной пули для вас (или меня), извините!

Мое использование было на самом деле очень близко к вашему (хотя анимированных кадров не было), и использование OpenGL ES сделало переход от мучительно вялого к совершенно быстрому, так что есть надежда для вас!

0 голосов
/ 10 ноября 2010

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

  • Не закругляйте углы, используя -setCornerRadius на слое UIImageView.Вы никогда не поверите, насколько это может ухудшить производительность

  • Если вы используете тени на заднем плане, убедитесь, что вы также указали путь тени на слое.

  • Попробуйте включить -shouldRasterize на слое UIImageView: [[insectView layer] setShouldRasterize:YES];

Не хочется это говорить, но после этого, как уже говорили другие, OpenGL является единственнымвыбор.

0 голосов
/ 10 ноября 2010

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

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