2D平面视图动画中的不间断垃圾收集

时间:2013-12-21 22:37:13

标签: java android garbage-collection surfaceview

我遇到的问题是在运行2D动画时不断调用系统GC,我不知道为什么。

我读过的所有内容都建议避免在onDraw()方法中创建位图,我没有这样做,但我仍然每秒调用一次GC,这严重影响了低端设备的可用性。 / p>

代码很长,所以我不会在这里发布,但基本上,有一个调用的线程 _surfaceHolder.lockCanvas(null),然后是postInvalidate,导致调用onDraw(),然后调用_surfaceHolder.unlockCanvasAndPost(_canvas)

我的onDraw()方法有几次_canvas.drawCircle(...)_canvas.drawBitmap(...)的迭代(绘制在创建SurfaceView时创建一次的位图),以及涉及Math.pow(...)的大量数值计算。该应用程序使用多个(10+)Double ArrayLists,它在每个onDraw()例程中多次读取和写入。

任何人都可以解释为什么经常调用GC以及我可以做些什么来帮助?我只是计算太多,不应该期望更高的帧率?

编辑:值得一提的是,即使我注释掉所有位图绘制并且FPS随着时间的推移稳定下降,动画运行的时间越长,这个问题仍然存在。

1 个答案:

答案 0 :(得分:1)

我认为您的问题是因为您在评论时使用了DoubleList。 Big double Double 是一个对象包装器,而 double 是一个原生的。每当你在算术运算中从Double切换到double并且反之亦然时,会产生大量垃圾,迫使GC开始收集大量会降低性能的微小物体。

根据我使用double []而不是ArrayList< Double >的经验可以显着提升绩效

希望它有所帮助!