libGDX:在libGDX中存储许多小图像以便快速绘制的最佳方法

时间:2016-04-03 13:51:20

标签: libgdx

我正在为libGDX(适用于Android和桌面)的多人游戏平铺游戏编写客户端。 游戏世界由数千个小的32x32 png图像组成,这些图像被绘制成一个大的矩形视图区域。根据需要通过套接字连接(网络)下载图像。

将这些图像存储在“内存”中的最佳(最快且资源效率最高)方式是什么?这样可以在需要时将它们快速绘制到屏幕上?

到目前为止,我已经实现了一个非常天真的算法,它将每个32x32图像加载到纹理中,并将其无限期地保存在内存中。 (纯粹的巧合我的图像的大小是2的幂。)它似乎工作,但我担心这是非常低效的,可能超过旧设备上的GPU资源或其他东西。

我知道TextureAtlas,但这似乎只适用于打包并存储在已编译的Android应用程序中的静态图像。当我通过网络动态接收图像时,我相信这对我不起作用。

我发现这篇libgdx SpriteBatch render to texture帖子建议将许多小图片渲染到FrameBuffer中,然后将其用作TextureRegions的来源。这似乎对我很有希望。这是一个好的解决方案吗? 还有更好的方法吗?

我也想知道将我的小图像绘制并存储到大型Pixmap中可能会有所帮助。如上所述,这可能是比绘制FrameBuffer更好的方法吗? 正如我从文档中理解的那样,Pixmaps纯粹是基于内存的。这可能是一个优势,因为它可能不需要图形资源,另一方面可能更慢,因为加载到纹理是一个昂贵的操作。对此的想法?

1 个答案:

答案 0 :(得分:1)

实际上TextureAtlas是存储许多图像(小或不小)的最佳方式,幸运的是,TextureAtlas实例不必以静态方式创建。

看看

    addRegion(java.lang.String name, Texture texture, int x, int y, int width, int height)

TextureAtlas' es方法。它可以动态创建地图集。

所以你应该做的是创建空的地图册

    TextureAtlas atlas = new TextureAtlas();

然后在某种循环中添加你的图像

    for(Texture texture : yourTexturesCollection)
        atlas.addRegion(...);

然后您可以使用findRegion或其他方法(参考参考资料)来使用地图集

请注意,对于Android设备,建议使用不大于2048 x 2048px 的地图集。

对于另一种设备(如dekstop),此值可以是另一种(通常更大)。这不是LibGDX限制,而是openGL的!