【发布时间】:2014-09-15 15:42:30
【问题描述】:
我正在开发一款适用于 Android 平台的游戏,使用 Java 和 LibGDX 引擎。
我遇到了一个奇怪的问题,我的游戏中的 FPS 每 30-40 秒从 57-60 帧下降到 40-45 帧,然后又恢复。以下是 logcat 输出的屏幕截图。垃圾收集器在这些时刻不工作(日志中没有过滤任何内容):
我进行了一些分析,发现问题是由于 EGLImpl.eglSwapBuffers 调用每 30-40 秒花费的时间比平时多。在下面的屏幕截图中(在没有任何反应的情况下分析游戏菜单时拍摄)需要 3.7 毫秒:
在我的菜单渲染周期中,我只调用 MyStage.act() 和 MyStage.draw() 来绘制一组 ImageButtons - 没什么特别的。我的菜单帧渲染时间(平均 17 毫秒)对于这种简单的渲染来说似乎也太长了,但这些定期的长缓冲区交换调用是我现在主要关心的问题。
顺便说一句,如果我在游戏过程中进行分析,情况会变得更糟 - 这些 EGLImpl.eglSwapBuffers 调用需要 15 毫秒甚至更多时间,并将 FPS 降至 30 并不断保持:
我真的可以就如何调查这个问题提出一些建议。
【问题讨论】:
-
更新:我已经优化了菜单渲染帧 - 现在只需要 7 毫秒,但 EGLImpl.eglSwapBuffers 出于某种原因仍然需要 11 毫秒,并使 FPS 保持在 50 左右,周期性下降到 44-46。根据我在互联网上阅读的内容,我假设 eglSwapBuffers 应该将图形输出“对齐”到每帧 16 毫秒,因此如果帧的渲染速度超过 16 毫秒,则生成的 FPS 应该是 60...
标签: java android opengl-es libgdx frame-rate