我遇到一个问题,即在运行我的 2D 动画时系统 GC 被不断调用,我不确定为什么。
我读过的所有内容都建议避免在 onDraw() 方法中创建位图,我没有这样做,但我仍然每秒调用一次 GC,这严重影响了低端设备的可用性。
代码很长,这里就不贴出来了,不过基本上有个线程调用
_surfaceHolder.lockCanvas(null)
, 然后 postInvalidate
,导致 onDraw() 被调用,然后是 _surfaceHolder.unlockCanvasAndPost(_canvas)
.
我的 onDraw() 方法有几次迭代 _canvas.drawCircle(...)
, _canvas.drawBitmap(...)
(画的是创建SurfaceView时创建过一次的位图),还有大量涉及Math.pow(...)
的数值计算.该应用程序使用多个 (10+) double ArrayLists,它在每个 onDraw() 例程中对其进行多次读取和写入。
谁能阐明为什么 GC 如此频繁地被调用以及我可以做些什么来提供帮助?我是不是只是计算太多,不应该期待更高的帧率?
编辑:值得一提的是,即使我注释掉所有位图绘制并且 FPS 随着时间的推移稳步下降,动画运行的时间越长,这个问题仍然存在。
最佳答案
我认为您的问题是因为您在评论时使用了 Double 的 ArrayList。 Big double Double 是一个对象包装器,而 double 是一个本地对象。每当您在算术运算中从 Double 切换到 double 或从 Double 切换到 double 时,都会产生大量垃圾,迫使 GC 开始收集大量微小的对象,这会大大降低性能。
根据我的经验,使用 double[] 而不是 ArrayList<Double> 可以显着提高性能
希望对您有所帮助!
关于java - 二维表面 View 动画中的不间断垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20724273/