LibGDX优化以大分辨率绘制背景的方式

时间:2018-01-06 12:21:47

标签: android opengl-es libgdx render-to-texture

我有一个问题,一直折磨我一个月,也许更多。背景大约为9000x13000像素。我正试图将这个背景带到屏幕上。由于我的视频卡仅支持分辨率不超过8192x8192像素的纹理,因此会显示黑色区域而不是纹理。我将图像压缩为5000x7000像素。现在它显示,但FPS已降至50(除了一个图像没有任何内容)。此外,该游戏还可以在移动设备上运行,视频卡的局限性可能是2048x2048纹理,也可能更少。我试图将我的大纹理分成117块(每块不超过1024x1024像素)并一个接一个地拉它们。现在游戏的负载大约是一分钟,当纹理输出时,FPS下降到5!我试图使用过滤器

texture.setFilter(
    Texture.TextureFilter.MipMapNearestNearest,
    Texture.TextureFilter.Nearest
);

但是FPS没有超过10.它还在加载时将useMipMap标志设置为true。目前我正在这样做:

Texture texture=new Texture(file, true);
texture.setFilter(
    Texture.TextureFilter.MipMapNearestNearest,
    Texture.TextureFilter.Nearest
);
public void render()
{
    batch.begin();
    batch.draw(texture,0,0,Gdx.graphics.getScreenWidth(),Gdx.graphics.getScreenHeight());
    batch.end();
}

告诉我,如何优化大纹理的输出? 这个纹理是一个地图,所以当接近大屏幕时,它应该清楚详细。

我将不胜感激任何帮助

1 个答案:

答案 0 :(得分:0)

我没有使用libgdx测试它,但我认为值得尝试根据游戏中当前的缩放级别选择显示的纹理/纹理的几种变体,此外还有原始纹理切成碎片。考虑放大时在Google地图中加载图片。

想法

让我们通过以下方式将缩放级别定义为数字:

  • 1是最大缩放
  • 2缩小为2
  • 3缩小为4
  • 4缩小为8
  • ...

然后是如何定义纹理:

  1. 将原始纹理切割成2048x2048(~7x5 = 35件,大多数移动设备支持大小为2048的纹理)。将它们用于缩放级别1.在这种情况下,您将同时加载最多4个纹理。
  2. 将原始纹理缩小2并再次切成碎片。这将为您提供大约9个纹理。将它们用于1到2之间的缩放级别。
  3. 再缩小一次=> 3纹理。将它们用于2到3之间的水平。
  4. 还有一次=>等级3或更高。你可以在这里停下来。
  5. 现在,当用户缩小时,使用纹​​理#4。当用户放大到3级或更低级别时,仍会显示纹理#4,同时加载缩放纹理集。然后使用fadeIn / out进行平滑过渡,以获得更好的视觉效果。

    更多提示

    1. 为了更快地加载纹理,请考虑使用压缩纹理。压缩纹理的文件大小通常与PNG相当,但它可以更快地加载到视频内存中,并使用与原始文件相同的RAM量。 (因为它不需要解压缩到原始位图中)。特别考虑ASTC。旧设备不支持ASTC,但我认为您的要求很高,以便让游戏运行。
    2. 仅当用户放大到适当的级别时才将纹理加载到内存中。用户缩小后卸载纹理。由于纹理压缩,这应该足够快。我会将纹理#4始终保留在内存中以获得更流畅的UX。由于相同的原因,保持中间水平可能是有意义的(例如,保持第3组的纹理,同时放大到第2级)。
    3. 为了更好地加载/卸载纹理,请多考虑用户行为(比如缩放的典型用法)。或者你可以使用某种LRU Cache并“自动”卸载纹理。