gpt4 book ai didi

java - 二维表面 View 动画中的不间断垃圾收集

转载 作者:行者123 更新时间:2023-11-30 03:12:27 25 4
gpt4 key购买 nike

我遇到一个问题,即在运行我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com