如何在Android上制作全屏动画?我应该使用OPENGL吗?

4

我需要制作若干个由大约500帧组成的全屏动画。

动画应该以合理的速度播放,假设不少于20fps,图片应该是合理的质量,不要过度压缩。

你认为我应该使用什么方法呢?

到目前为止,我已经尝试了:

1. storing each frame as a compressed JPEG
2. before animation starts, loading each frame into a byteArray
3. as the animation plays, decode corresponding byteArray into a bitmap
and draw it on a surface view.

问题 - 速度太慢,通常约为5-10帧每秒。
我考虑了另外两个选项。
1. 将所有动画转换为一个电影文件...但我想可能会存在启动、暂停和定位到恰好正确的帧的问题...你觉得呢?
2. 我想到的另一个选项是使用OPENGL(虽然我以前从未使用过),逐帧播放动画。你认为,OPENGL能够处理它吗?
谢谢!
编辑,我成功地窥视了TalkingTom,并发现它包含大约20兆的良好压缩的JPEG,就像这样。
3个回答

3
你可以用几种不同的方式来处理它。
  1. 听起来解码是你的瓶颈。你可以尝试在播放动画之前完成包括解码在内的所有三个步骤,这样你只需要绘制已转换的位图。

  2. OpenGL绝对能够胜任任务,因为绘制很可能永远不会成为你的瓶颈。但正如上面所说,绘制似乎不是问题所在。

  3. 在设备上进行动画。如果你正在动画几何对象或像素图,并且动画具有公共背景,那么你可以将动画分离成“演员”,并将它们移动 - 这将需要更少的数据。

编辑:移动设备上的复杂动画很少是全屏电影或一系列图像 - 大量(冗余)数据会令人难以承受(正如你已经注意到的那样)。它们是2D和3D模型的动画。对于3D,建议使用OpenGL;对于2D,常见的画布绘制可能已经足够了。为了使其更加高效,你可以将模型分成单独的部分并分别对它们进行动画处理(看起来类似于SouthPark动画)。你可以将其与使用精灵表(像是单独的小电影条)来动画处理单独的部分相结合。这将为你提供更大的灵活性,同时仍然使用比压缩电影少得多的数据。


一个安卓设备能够在其内存中容纳多少个全屏位图?通常大约是5个 ;) - Roger Travis
@RogerTravis - 这取决于分辨率和位深度,但可能不够。我个人会选择第三种方法。 - kostja
由于在我的情况下动画几乎占据了整个屏幕,第三种方法行不通... - Roger Travis
只要动画不完全由照片图像组成,出于数据大小的原因,我仍然更喜欢第三个选项而不是全屏图像或电影。不过,我可能误解了您的要求。您是否有这样一种动画的示例?- @RogerTravis - kostja
一个例子就是Talking Tom应用程序(https://play.google.com/store/apps/details?id=com.outfit7.talkingtom2free),在这个应用中,猫几乎占据了整个屏幕。 - Roger Travis
编辑了帖子后,看起来TalkingTom由一系列的JPEG组成,我认为在这种情况下这是正确的方式。如果它们仍然占据大约80%的屏幕,那么将动画切割成精灵没有任何用处。因此,唯一的问题是如何使这些JPEG以良好的FPS速率播放。 - Roger Travis

2

我认为你需要把它转换成电影文件 - 这样可以获得适当的压缩,而安卓则可以通过媒体播放器完成所有工作。我相信找到正确的帧数是相当容易的,但你可能需要在视频流上使用较低的压缩来使其正常运行。


1

看起来这个引擎主要用于动画一些小精灵沿着某条路径飞行、GUI 等,而不是播放真正的全屏逐帧动画……或者我误解了吗? - Roger Travis
在这个示例应用程序中,它有一个全屏闪屏动画,并且运行得非常好。就像我之前说的那样,我“可能”会做到这一点。你最好试一试。Kostja的第三种方法也很合理。 - Ercan

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