我正在测试杂志的动画方法,比如以媒体为中心的应用程序。我的目标是
我正在考虑核心动画或OpenGL。
OpenGL肯定更快,但正如我所知,在GL精灵中集成视频播放是不可能的。 (它需要视频到纹理特征)
所以我正在挖掘Core Animation。但表现太糟糕了。我尝试使用256个11x10px,alpha混合位图精灵进行简单的重力模拟。我只得到了
瓶颈显然是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];
}
答案 0 :(得分:1)
在Shark(CHUD工具的一部分)下运行您的代码并查看大部分时间花在哪里 - 这应该可以为您提供关于优化工作重点的线索。