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