
我正在使用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的突然变化也可能是由于您的设备切换到节能模式引起的.
总结以上是内存溢出为你收集整理的Java-Android LibGDX游戏:由于长时间的EGLImpl.eglSwapBuffers调用,FPS下降全部内容,希望文章能够帮你解决Java-Android LibGDX游戏:由于长时间的EGLImpl.eglSwapBuffers调用,FPS下降所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)