Java Android OpenGL ES 1.0生成大量垃圾收集调用。(SpriteBatcher)

Java Android OpenGL ES 1.0生成大量垃圾收集调用。(SpriteBatcher),java,android,opengl-es,garbage-collection,Java,Android,Opengl Es,Garbage Collection,我一直致力于将一款实时街机类型的Android游戏从基于画布的渲染系统移动到OpenGL。因为我完全没有使用Android的经验,所以我选择使用它,它是一个渲染器和资源管道实现。迁移的过程相当简单,但我在使用Dalvik VM的设备上遇到了性能问题。与我的ART设备不同,在我的ART设备中,GC几乎从未被调用,游戏运行平稳,而较旧的Dalvik设备每秒进行多达5次GC扫描 01-09 10:10:06.748: D/dalvikvm(5124): GC_CONCURRENT freed 530K

我一直致力于将一款实时街机类型的Android游戏从基于画布的渲染系统移动到OpenGL。因为我完全没有使用Android的经验,所以我选择使用它,它是一个渲染器和资源管道实现。迁移的过程相当简单,但我在使用Dalvik VM的设备上遇到了性能问题。与我的ART设备不同,在我的ART设备中,GC几乎从未被调用,游戏运行平稳,而较旧的Dalvik设备每秒进行多达5次GC扫描

01-09 10:10:06.748: D/dalvikvm(5124): GC_CONCURRENT freed 530K, 49% free 3181K/6151K, external 1190K/1599K, paused 4ms+4ms
这就是每当渲染发生时我经常看到的垃圾消息类型。在从画布切换到艺术设备之前,存在一些轻微的性能问题,但较旧的设备现在比画布渲染更落后。游戏循环通过渲染器的onDrawFrame()方法在渲染线程中运行。在ON_DIRTY和Continuous之间设置最大帧速率或更改渲染模式并没有产生任何明显的差异。我还尝试完全删除所有的draw命令,并简单地呈现一个黑屏,而GC调用仍然被垃圾处理,没有任何明显的变化

作为最新的开发,我尝试使用sprite床单,在较新的Dalvik设备上,性能得到了极大的提高,在较旧的Dalvik设备上,性能也得到了改善,尽管还不够。尽管GC消息仍以相同的速率被垃圾邮件发送,但情况仍然如此。上面的消息来自这个新版本:与旧版本的区别在于暂停时间显著减少,应用程序的最大堆大小增加。释放的内存量保持在相同的水平


我的问题是:是什么导致了这些常量GC调用,它能被修复吗?如果不能,这对Java OpenGL应用程序来说是正常的吗?SpriteSheets的性能在任何稍新的设备上看起来都相当不错,我只是担心GC调用是我或渲染器代码中某些关键错误的标志。

垃圾被收集是因为垃圾正在生成。你应该弄清楚分配了什么,以及是否有可能避免这些分配。DDMS“分配跟踪程序”提供有关最近分配的信息()。另请参见Android Breakout(),以获取一个简单的GLES2游戏的示例,该游戏在游戏循环中没有分配。我只是查看了SpriteBatcher的代码库,嗯,是的,我不确定是否会选择它,因为它看起来像是在batchDraw调用中使用迭代器和类型转换。这两种方法中的任何一种都是创造对象,在任何性能游戏中都是一个大禁忌。正如你所说,你对安卓系统没有经验,在实时游戏中观看两个谷歌IO视频可能会有所帮助。虽然有些部分已经过时,但与编程相关的东西仍然很有用:谢谢你的评论,它们证实了我已经怀疑过的东西。我将根据这些原则开发我自己的渲染器,我还将仔细研究我的游戏循环。