【问题标题】:FPS drop after moved from Textures to TextureAtlas in LibGDX在 LibGDX 中从 Textures 移动到 TextureAtlas 后 FPS 下降
【发布时间】: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


【解决方案1】:

感谢所有的cmets,我已经解决了这个问题。 我在渲染时调用了AssetManager.update,当它完成加载时,我将所有区域加载到静态字段中以便于访问。

问题在于,即使在我填充了所有字段之后,每次都会调用它。我猜所有重复的findRegion 电话都会打嗝。所以基本上问题是渲染循环中的处理过多。

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多