Java 2D surfaceview动画中的不停止垃圾收集

Java 2D surfaceview动画中的不停止垃圾收集,java,android,garbage-collection,surfaceview,Java,Android,Garbage Collection,Surfaceview,我遇到了一个问题,运行2D动画时不断调用系统GC,我不知道为什么 我读到的所有内容都建议避免在onDraw()方法中创建位图,我没有这样做,但我仍然每秒调用一次GC,这严重影响了低端设备的可用性 代码很长,所以我不会在这里全部发布,但基本上,有一个线程调用 \u surfaceHolder.lockCanvas(null),然后调用postInvalidate,导致调用onDraw(),然后调用\u surfaceHolder.unlockCanvasAndPost(\u canvas) My

我遇到了一个问题,运行2D动画时不断调用系统GC,我不知道为什么

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

代码很长,所以我不会在这里全部发布,但基本上,有一个线程调用
\u surfaceHolder.lockCanvas(null)
,然后调用
postInvalidate
,导致调用onDraw(),然后调用
\u surfaceHolder.unlockCanvasAndPost(\u canvas)

My onDraw()方法多次迭代了canvas.drawCircle(…),
\u canvas.drawBitmap(…)
(绘制一个在创建SurfaceView时创建过一次的位图),以及大量涉及
Math.pow(…)
的数值计算。应用程序使用多个(10+)双数组列表,在每个onDraw()例程中对其进行多次读写

有人能解释一下为什么经常调用GC,以及我能做些什么来提供帮助吗?我只是计算太多,不应该期望更高的帧率吗


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

我认为您的问题是因为在注释时使用了双精度的ArrayList。Big double是一个对象包装器,而double是本机的。每当您从Double切换到Double,反之亦然,在您的算术运算中会产生大量垃圾,迫使GC开始收集大量会严重降低性能的微小对象

根据我的经验,使用double[]代替ArrayList可以显著提高性能


希望有帮助

你做过堆分析吗?这里有一个很好的博客帖子:谢谢你的链接!在运行堆分析之后,我发现byte[]数组占用了大量内存。我有一个500x500px的图像,我忘了它还在创建中,即使我没有把它画到画布上。当我把这一行注释掉时,我得到的GC调用要小得多(但也同样频繁)。我想你已经了解了这个问题。当我删除所有位图分配时(在进行内存分配分析之后),我仍然会收到同样频繁的GC调用,但数量和时间要少得多,这使我相信双ArrayList是产生频率的原因,位图大小是它所需时间的来源。