【发布时间】:2014-10-02 09:45:35
【问题描述】:
我前段时间开始使用 LibGDX,我正在制作一个测试项目以适应这个库。我创建了一些图像并将它们添加到资产文件夹并使用AssetManager 将每个图像加载为Texture。一切正常,我有 60 FPS。
我想以更高效的方式工作,所以我使用 TexturePacker 工具将所有图像打包到一个图集中。我再次使用AssetManager 加载了图集,并开始使用TextureRegions 而不是Textures。
在此更改之后,我开始注意到 FPS 从 60 突然下降到 50,甚至一度下降到 30。我尝试将像素格式更改为 RGBA4444,我确保 min 和 mag 过滤器都设置为 Nearest,但我仍然看到那些烦人的丢帧。
我在游戏本身并没有做任何繁重的事情,目前是一些演员在一个舞台上。我得到了一些 MoveAction 和动画,但还没有什么特别的。
有人知道什么会导致 FPS 下降吗?
谢谢
【问题讨论】:
-
一种可能性是您在渲染循环中创建了许多新对象,因此每当 GC 必须清理其中一些对象时,都会出现短暂的停顿。我的经验法则是永远不要在
render方法中使用new关键字或任何由它调用的东西。这有点矫枉过正,但它使我不会犯下创建一堆很快就会超出范围的对象的错误。 -
Pool 和 Pools 类也确实有助于避免 GC。它们已被设置为自动为任何类创建对象池。例如,当您在渲染循环中需要一个新对象时,只需调用
Vector3 tmpVec3 = Pools.obtain(Vector3.class);即可获得 Vector3。当您处理完对象后,只需将其返回到池中,而不是让 GC 清理它:Pools.free(tmpVec3);. -
对每个图像使用纹理图集而不是纹理永远不会导致 fps 下降。这是 OpenGL 绘制的方式。
-
使用其中一种 Android 分析工具来查看您的时间在哪里。
标签: libgdx textures frame-rate texturepacker texture-atlas