我正在开发一个使用Java和LibGDX引擎的Android平台游戏。但我遇到了一个奇怪的问题,每隔30-40秒,我的游戏FPS会从57-60降到40-45帧,然后恢复正常。下面是logcat输出的屏幕截图。在这些时刻,垃圾回收器不起作用(日志中没有过滤任何内容):
我进行了一些分析,并发现问题出现在EGLImpl.eglSwapBuffers调用上,每隔30-40秒需要比平时更长的时间。在下面的屏幕截图中(在菜单渲染期间进行分析,此时什么都没有发生),它需要3.7毫秒:
在我的渲染循环中,我只是调用MyStage.act()和MyStage.draw(),它们绘制一组ImageButtons——没什么特别的。我的菜单帧渲染时间(平均17ms)也对于如此简单的渲染来说似乎太长了,但这些奇怪的周期性长缓冲区交换调用现在是我的主要关注点。
顺便说一下,如果我在游戏过程中进行分析,情况会变得更糟——这些EGLImpl.eglSwapBuffers调用需要15毫秒以上,并将FPS降至30并保持不变:
我真的需要一些建议来解决这个问题。
![LogCat part 1](https://istack.dev59.com/ayiNE.webp)
![LogCat part 2](https://istack.dev59.com/w1gBO.webp)
![Profiling of game menu](https://istack.dev59.com/6TGFs.webp)
在我的渲染循环中,我只是调用MyStage.act()和MyStage.draw(),它们绘制一组ImageButtons——没什么特别的。我的菜单帧渲染时间(平均17ms)也对于如此简单的渲染来说似乎太长了,但这些奇怪的周期性长缓冲区交换调用现在是我的主要关注点。
顺便说一下,如果我在游戏过程中进行分析,情况会变得更糟——这些EGLImpl.eglSwapBuffers调用需要15毫秒以上,并将FPS降至30并保持不变:
![profiling during the gameplay](https://istack.dev59.com/MijA0.webp)