核心动画应用程序的任何优化方法建议?

时间:2010-11-21 11:50:14

标签: ios core-animation performance

我正在测试杂志的动画方法,比如以媒体为中心的应用程序。我的目标是

  • 数百个精灵的流畅动画
  • 带视频播放
  • 和动画屏幕上的标准UI叠加。

我正在考虑核心动画或OpenGL。

OpenGL肯定更快,但正如我所知,在GL精灵中集成视频播放是不可能的。 (它需要视频到纹理特征)

所以我正在挖掘Core Animation。但表现太糟糕了。我尝试使用256个11x10px,alpha混合位图精灵进行简单的重力模拟。我只得到了

  • 10 fps
  • 5%设备利用率
  • 5%渲染器利用率
  • 0%tiler利用率。

瓶颈显然是CPU代码。

据我所知,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 个答案:

答案 0 :(得分:1)

在Shark(CHUD工具的一部分)下运行您的代码并查看大部分时间花在哪里 - 这应该可以为您提供关于优化工作重点的线索。