我正在创建一个涉及大量动画的应用程序。
例如:
我得到了一组png文件(50+)并以15fps的帧速率迭代它们,使它看起来像一个动画。
我有很多像这样的图像文件组。图像大小:480x800,带alpha。
我的应用程序工作基本没问题,而我在播放动画时在logcat中发现了很多GC_FOR_ALLOC。
我的问题是,有这么多的GC_FOR_ALLOC,我可以忽略它们,或者想到消除它们吗?我的应用程序也有一个小问题,不确定是否与GC相关,在一些较旧的Android设备上,帧速率无法达到甚至10fps。
我尝试回收位图,但似乎只标记该项可用于GC。
我以这种方式加载图片:
BitmapFactory.Options localOptions = new BitmapFactory.Options();
localOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;
try {
return BitmapFactory.decodeStream(context.getAssets().open(fileName), null, localOptions);
} catch (IOException e) {
e.printStackTrace();
}
return null;
加载图像后,我在SurfaceView上绘制它们,如下所示:
canvas.drawBitmap(BgImage,rectBG2, rectScreen2, null);
对于每一帧,我需要绘制约3幅图像(3层)。不确定这是否与GC有关。
下面的是这些GC的一个例子:
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17653K/32583K, paused 29ms, total 29ms
E/ttt ( 4993): 66
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17653K/32583K, paused 25ms, total 25ms
E/ttt ( 4993): 64
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1500K, 46% free 17654K/32583K, paused 25ms, total 25ms
E/ttt ( 4993): 64
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17654K/32583K, paused 26ms, total 26ms
E/ttt ( 4993): 66
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17654K/32583K, paused 37ms, total 37ms
E/ttt ( 4993): 83
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1500K, 46% free 17654K/32583K, paused 37ms, total 38ms
E/ttt ( 4993): 68
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17654K/32583K, paused 25ms, total 26ms
E/ttt ( 4993): 53
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1500K, 46% free 17654K/32583K, paused 25ms, total 26ms
E/ttt ( 4993): 62
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17654K/32583K, paused 27ms, total 27ms
E/ttt ( 4993): 67
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17654K/32583K, paused 27ms, total 27ms
E/ttt ( 4993): 67
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1500K, 46% free 17654K/32583K, paused 26ms, total 26ms
E/ttt ( 4993): 66
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1501K, 46% free 17654K/32583K, paused 27ms, total 27ms
E/ttt ( 4993): 66
D/dalvikvm( 4993): GC_FOR_ALLOC freed 1500K, 46% free 17654K/32583K, paused 26ms, total 26ms
E/ttt ( 4993): 65
目前我正在尝试从JNI加载位图,就像游戏引擎一样,不确定这是否是正确的方法。
答案 0 :(得分:2)
虽然您的应用 应该运行正常,但我认为最好的办法是考虑摆脱它们。请记住,这意味着您的应用必须不断释放资源,这对您的应用来说非常耗时(当它运行那么多时),而且从内存管理的角度来看也很糟糕。你可以在这里看到更多相关信息:https://stackoverflow.com/a/11312145/3342157虽然你现在可能没有任何问题,但它可能会导致以后出现重大减速(如果还没有)。
至于如何摆脱它们,请记住,如果要更改图像,则只需重新加载图像。如果你不是,我会说不要每帧重新加载它。如果你有几个图像,它将在它们之间交换并且可以负担得起使用内存(不确定图像大小),在开始时加载它们,然后保持它们以便稍后渲染。我看到你是专门谈论动画,我的建议是创建一个精灵表,以防止必须加载每个PNG图像。