有没有针对Core Animation应用的优化方法建议?

3
我正在测试杂志类媒体应用的动画方法。我的目标是:
  • 流畅地播放数百个精灵
  • 同时支持视频播放
  • 并在动画屏幕上覆盖标准UI叠加层。
我正在考虑使用核心动画或OpenGL。
OpenGL 明显更快,但我知道将视频播放集成到GL精灵中仍然不可能(需要视频纹理功能)。
因此我开始研究核心动画。但性能太差了。我尝试使用256个11x10像素、alpha混合位图精灵进行简单的重力模拟。结果只有:
  • 10 fps
  • 5% 设备利用率
  • 5% 渲染器利用率
  • 0% 图块利用率。
瓶颈明显在CPU代码上。
据我所知,CA使用GL进行合成,并且我只使用了一个小位图。因此这个结果是不合理的。CA框架本身有很大的开销,但是我无法找出问题所在,也不知道该如何解决。 我尝试过优化,但选择很少。我尝试了显式事务,删除了所有附加的插值。然而,性能没有得到改善。我尝试了显式动画,但是它的行为太难理解了。也许瓶颈就在那里。 有任何优化方法建议吗? 这是我的滴答源代码:(使用CADisplayLink调用tick):
- (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
在Shark(CHUD工具的一部分)下运行您的代码,查看大部分时间花费在哪里 - 这应该能给您一个提示,告诉您应该将优化的重点放在哪里。

谢谢。但问题是我不知道在哪里修复。我尝试了我所知道的所有方法。因此,我正在寻求一些额外的优化方法 :)(对于我的不清楚的问题感到抱歉) - eonil
@Eonil:使用Shark对代码进行性能分析的整个目的是为了识别“热点”-尝试一下,您将更好地了解为什么代码运行速度不够快,并且您可以回来询问有关优化代码中那些昂贵部分的具体问题。 - Paul R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接