Любое предложение по оптимизации для приложений Core Animation? - PullRequest
3 голосов
/ 21 ноября 2010

Я тестирую метод анимации для журнала, как медиа-ориентированное приложение.Моя цель -

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

Я рассматриваю Core Animation или OpenGL.

OpenGL определенно быстрее, но интеграция воспроизведения видео в пределах спрайтов GL пока невозможна, насколько я знаю.(требуется видео для функции текстуры)

Так что я копаю Core Animation.Но производительность была слишком плохой.Я попробовал простое моделирование гравитации с 256 из 11x10px, альфа-смешанных растровых спрайтов.И я получил только

  • 10 кадров в секунду
  • 5% использования устройства
  • 5% использования рендерера
  • 0% использования тайлера.

Узкое место очевидно в коде процессора.

Как я знаю, CA использует GL для компоновки, и я использовал только один крошечный битовый массив.Так что этот результат необоснован.Сам фреймворк CA имеет огромные накладные расходы, но Я не могу понять, где он находится и как его исправить.

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

Любое предложение по способу оптимизации?

Вот мой тиковый исходный код: (отметьте с помощью CADisplayLink):

- (void)tick
{
 [CATransaction begin];
 [CATransaction setAnimationDuration:0.0f];

 CGRect bounds = [hostLayer bounds];
 CGFloat gravity = +9.8f * 0.1f;

 for (TestParticleSprite *tspr in spriteLayers)
 {
  CGSize mtn = [tspr motion];
  CGPoint ctr = [tspr position];

  mtn.height += gravity;  
  ctr.x  += mtn.width;
  ctr.y  += mtn.height;

  CGFloat over = ctr.y - bounds.size.height;
  if (over > 0.0f)
  {
   // Hit the ground!
   ctr.y  = bounds.size.height - over;  // Bounce.
   mtn.height *= -1.0f;       // Bounce.
//   mtn.width *= 0.95f;       // Lose energy.
//   mtn.height *= 0.95f;       // Lose energy.
  }

  [tspr setMotion:mtn];
  [tspr setPosition:ctr];
  [tspr removeAllAnimations];

//  // Tried explicit animation, but it was unable to make it work.
//  CATransform3D  t  = CATransform3DMakeTranslation(ctr.x, ctr.y, 0.0f);
//  CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
//  [anim setAdditive:NO];
//  [anim setCumulative:NO];
////  [anim setFromValue:[NSValue valueWithCATransform3D:t]];
//  [anim setToValue:[NSValue valueWithCATransform3D:t]];
//  [tspr addAnimation:anim forKey:nil];
 }

 [CATransaction commit];
}

1 Ответ

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

Запустите свой код в Shark (часть инструментов CHUD) и посмотрите, на что тратится большая часть времени - это должно дать вам представление о том, куда направить ваши усилия по оптимизации.

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