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

libGDX:在libGDX中存储许多小图像以便快速绘制的最佳方法,libgdx,Libgdx,我正在用libGDX(Android和桌面)为一个基于多人互动程序的游戏编写一个客户端。 游戏世界由数千个32x32 png小图像组成,这些图像被绘制到一个大的矩形视图区域中。根据需要通过套接字连接(网络)下载图像 什么是将这些图像存储在“内存”中的最佳(最快和最节省资源的)方法,以便在需要时将它们快速绘制到屏幕上 到目前为止,我已经实现了一个非常简单的算法,将每个32x32图像加载到纹理中,并将其不确定地保存在内存中。(纯属巧合,我的图像大小是2的幂次方。)这似乎是可行的,但我担心这是非常低效

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

什么是将这些图像存储在“内存”中的最佳(最快和最节省资源的)方法,以便在需要时将它们快速绘制到屏幕上

到目前为止,我已经实现了一个非常简单的算法,将每个32x32图像加载到纹理中,并将其不确定地保存在内存中。(纯属巧合,我的图像大小是2的幂次方。)这似乎是可行的,但我担心这是非常低效的,可能会超过旧设备或其他设备上的GPU资源

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

我发现这篇文章建议将许多小图像渲染到帧缓冲区,然后将其用作纹理区域的来源。这对我来说似乎很有希望。这是一个好的解决方案吗? 有更好的办法吗

我还想知道,将我的小图像绘制并存储到一个大的Pixmap中是否会有所帮助。这可能是一种比如上所述的绘制帧缓冲区更好的方法吗? 我从文档中了解到,pixmap完全是基于内存的。这可能是一个优势,因为它可能不需要图形资源,另一方面,加载到纹理中是一个昂贵的操作,因此速度可能较慢。对此的想法?

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

看看

    addRegion(java.lang.String name, Texture texture, int x, int y, int width, int height)
纹理拉丝法。它使动态创建atlas成为可能

所以,您应该做的是创建空的atlas

    TextureAtlas atlas = new TextureAtlas();
然后在某种循环中添加图像

    for(Texture texture : yourTexturesCollection)
        atlas.addRegion(...);
然后,您可以使用
findRegion
或其他方法使用您的地图册(查看参考资料)


请注意,对于android设备建议使用不大于2048 x 2048px的atlas


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

谢谢你指出这一点。虽然使用帧缓冲区似乎工作得相当好(已经过测试),但这似乎是一个更简单的解决方案。在查看TextureAtlas的源代码后,我相信它只不过是将数千个小纹理存储在一个数组中。这只是隐藏在漂亮外观后面的我的天真实现:-)我将继续使用我的帧缓冲区实现,因为这确实大大减少了纹理对象的数量。事实并非如此:)使用textureatlas的原因是只使用一个大纹理-在渲染东西时,首先需要将图形发送到GPU,这会影响性能。使用textureatlas,仅发送一次纹理。谷歌搜索SpriteBatch的
渲染调用