编程语言
首页 > 编程语言> > Java-Android LibGDX游戏:由于长时间的EGLImpl.eglSwapBuffers调用,FPS下降

Java-Android LibGDX游戏:由于长时间的EGLImpl.eglSwapBuffers调用,FPS下降

作者:互联网

我正在使用Java和LibGDX引擎开发适用于Android平台的游戏.

我遇到了一个奇怪的问题,我的游戏中的FPS每隔30-40秒从57-60帧不断下降到40-45帧,然后又恢复.下面是logcat输出的屏幕截图.垃圾收集器目前无法使用(日志中没有过滤任何内容):

 

我进行了一些分析,发现问题是由于EGLImpl.eglSwapBuffers调用而导致的,该调用每30-40秒比平时花费更多的时间.在下面的屏幕截图(在根本没有任何反应的情况下分析游戏菜单时拍摄),它需要3.7毫秒:

 

在菜单的渲染周期中,我只调用MyStage.act()和MyStage.draw()即可绘制一组ImageButtons-没什么特别的.对于这样的简单渲染,菜单的帧渲染时间(平均17ms)似乎也太长了,但是现在我主要关心这些固定的长缓冲区交换调用.

顺便说一句,如果我在游戏过程中进行配置,情况会变得更糟-这些EGLImpl.eglSwapBuffers调用需要15毫秒或更长时间,并将FPS降至30,并保持不变:

我真的可以就如何进行调查使用一些建议.

解决方法:

您需要了解交换缓冲区的含义.这意味着您告诉OpenGL,您已经完成了所有“渲染命令”的发送,现在它可以将完成的渲染图像发送到屏幕上以显示它了.

这意味着什么?这意味着您的图形卡已经完成了所有渲染!大多数GL调用将立即返回而不会阻塞.这意味着您的CPU可以继续工作,GPU可以并行工作,处理从CPU接收到的渲染命令的队列.

现在,如果您的CPU能够比GPU完成更快的速度,则交换缓冲区意味着GPU必须完成对整个队列的处理,然后才能实际交换缓冲区并返回.

总的来说,这并不是问题所在,实际的eglSwapBuffers占用的时间如此多,而仅仅是GPU无法跟上CPU的速度.例如,这意味着您的场景太复杂,状态更改太多,例如纹理绑定,着色器开关或类似的东西.

因此,通过对CPU进行概要分析,您将不会真正找到真正的问题.但是我真的不能告诉你问题出在哪里.由于您使用的是libGDX,因此GLProfiler在这里可能会为您提供帮助.

PS:FPS的突然变化也可能是由于您的设备切换到节能模式引起的.

标签:frame-rate,opengl-es,libgdx,java,android
来源: https://codeday.me/bug/20191029/1957779.html