我有一个很大的弹簧片(3808x1632)由42帧组成。
我将用这些帧呈现一个动画,并使用一个线程加载包含所有帧的位图数组,启动屏幕等待其结束。
我没有使用surfaceview(和画布的绘图功能),我只是在主布局的imageview中逐帧加载。
我的方法类似于Loading a large number of images from a spritesheet
实际上,完成过程需要15秒,这是不可接受的。
我使用这种函数:
for (int i=0; i<TotalFramesTeapotBG; i++) {
xStartTeapotBG = (i % framesInRowsTeapotBG) * frameWidthTeapotBG;
yStartTeapotBG = (i / framesInRowsTeapotBG) * frameHeightTeapotBG;
mVectorTeapotBG.add(Bitmap.createBitmap(framesBitmapTeapotBG, xStartTeapotBG, yStartTeapotBG, frameWidthTeapotBG, frameHeightTeapotBG));
}
framesbitmapteapotbg是一个大的spritesheet。
更深入地看,我在logcat中读到createBitmap函数需要很多时间,可能是因为spritesheet太大。
我发现在某个地方,我可以在大的spritesheet上创建一个窗口,使用rect函数和canvas,创建要加载到数组中的小位图,但还不太清楚。我说的是那个帖子:cut the portion of bitmap
我的问题是:我怎样才能加快切片速度?
编辑:
我试图使用这种方法,但看不到最终动画:
for (int i=0; i<TotalFramesTeapotBG; i++) {
xStartTeapotBG = (i % framesInRowsTeapotBG) * frameWidthTeapotBG;
yStartTeapotBG = (i / framesInRowsTeapotBG) * frameHeightTeapotBG;
Bitmap bmFrame = Bitmap.createBitmap(frameWidthTeapotBG, frameHeightTeapotBG, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmFrame);
Rect src = new Rect(xStartTeapotBG, yStartTeapotBG, frameWidthTeapotBG, frameHeightTeapotBG);
Rect dst = new Rect(0, 0, frameWidthTeapotBG, frameHeightTeapotBG);
c.drawBitmap(framesBitmapTeapotBG, src, dst, null);
mVectorTeapotBG.add(bmFrame);
}
可能是位图bmframe管理不正确。
最佳答案
简单的答案是更好的内存管理。
你正在加载的精灵表是巨大的,然后你将它复制成一堆小位图。假设雪碧片不能再小,我建议采取两种方法之一:
使用单个位图。这将减少内存副本以及dalvik必须增加堆的次数。但是,这些好处可能会受到从文件系统中加载许多映像(而不仅仅是一个映像)的需要的限制。这在普通电脑中是一样的,但是安卓系统可能会得到不同的结果,因为它们已经用完了闪存。
直接从你的雪碧片上。画画时,只需直接从雪碧表使用Canvas.drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
之类的东西。这将把文件负载减少到一个大的分配,而这个分配在活动的生命周期中可能只需要发生一次。
我认为第二个选项可能是这两个选项中更好的一个,因为它在内存系统上更容易,在gc上工作更少。