Android应用程序在日志中有太多GC_FOR_ALLOC可以吗?

时间:2014-07-16 03:06:58

标签: android bitmap garbage-collection android-canvas surfaceview

我正在创建一个涉及大量动画的应用程序。

例如: 我得到了一组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加载位图,就像游戏引擎一样,不确定这是否是正确的方法。

1 个答案:

答案 0 :(得分:2)

虽然您的应用 应该运行正常,但我认为最好的办法是考虑摆脱它们。请记住,这意味着您的应用必须不断释放资源,这对您的应用来说非常耗时(当它运行那么多时),而且从内存管理的角度来看也很糟糕。你可以在这里看到更多相关信息:https://stackoverflow.com/a/11312145/3342157虽然你现在可能没有任何问题,但它可能会导致以后出现重大减速(如果还没有)。

至于如何摆脱它们,请记住,如果要更改图像,则只需重新加载图像。如果你不是,我会说不要每帧重新加载它。如果你有几个图像,它将在它们之间交换并且可以负担得起使用内存(不确定图像大小),在开始时加载它们,然后保持它们以便稍后渲染。我看到你是专门谈论动画,我的建议是创建一个精灵表,以防止必须加载每个PNG图像。