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

标签 java android garbage-collection surfaceview

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

相关文章:

java - 破坏android中的中间 Activity

java - 程序可能由于垃圾收集问题而停止运行

go - 如何在 Golang 中查看 GOGC 值?

java - 如何将 Retrofit 2 响应保存到 SharedPreferences 中

java - BooleanFieldEditor 不从 PreferenceStore 加载值

android - 如何在没有 root 设备的情况下在 system/app 目录中安装 android 应用程序,以便用户无法卸载该应用程序

java - 对话框取消会使应用程序崩溃

java - 将垃圾收集日志保存到 ${yarn.nodemanager.log-dirs}/application_${appid}/container_${contid} 中,用于 Hadoop Yarn 上的映射器和缩减器

java - Google App Engine - Cloud Console Stackdriver 跟踪详细信息

java - NodeSq 不符合预期的整数类型