是否可以在Android上使用OpenGL绘制全屏单帧动画?

时间:2011-02-08 15:35:59

标签: android animation opengl-es

目前,我使用计时器和Canvas.onDraw() / canvas.drawBitmap在SurfaceView上全屏显示单帧动画。每帧的分辨率为480x320像素,并将在绘图时拉伸到屏幕分辨率。这在更快的设备上运行良好,帧速率高达15 fps。问题是我必须在动画开始之前加载每一帧(动画由30个单帧循环),因为动画将以高帧率显示。鉴于Android进程的小堆空间通常为16 MB,我的大多数测试设备都无法将所有30帧预加载到内存中,所以我想改用OpenGL。当我读取OpenGL时,内存不会被考虑在16 MB进程堆空间内,使用OpenGL可能是另一种选择。

现在我的问题是:OpenGL能够足够快地更改和显示纹理(我的单帧)足够快以实现15fps的高帧率吗?我读了一篇文章说,经常交换纹理会显着降低OpenGL的速度。你有没有经验呢?如果你已经可以说用15fps交换全屏纹理是不可行的,我不想花时间让OpenGL运行。

修改

我现在正在使用一种在不使用OpenGL的情况下使用默认Android NDK的技术。查看我的answer here

2 个答案:

答案 0 :(得分:2)

OpenGL性能还取决于您将使用的设备。但是在15fps下只显示30个纹理在大多数设备上都不会成为问题。

看看this article开始使用Android上的OpenGL。实现循环动画非常简单。

祝你好运!

答案 1 :(得分:0)

我不再需要为我的情况使用OpenGL,因为可以在不超出可用空间的情况下加载30帧。当我发现运行garbage collector时,释放了一些在加载30帧时占用的内存。由于我的代码看起来像是这样,所以我自己不能创建这些可以释放的对象:

for (int i=0; i < 30; i++) {
  Bitmap b = "load480x320BitmapFromResources(i)";
  frames.add(b);
}

此前代码将超出堆空间。但是添加了一行

System.gc();
循环中的

允许加载所有这些资源。奇怪,因为我没有自己创建对象,但我想Android框架的一些内部Bitmap加载代码就这样做了。

See also a more detailed description of this solution