我正在为libGDX(适用于Android和桌面)的多人游戏平铺游戏编写客户端。 游戏世界由数千个小的32x32 png图像组成,这些图像被绘制成一个大的矩形视图区域。根据需要通过套接字连接(网络)下载图像。
将这些图像存储在“内存”中的最佳(最快且资源效率最高)方式是什么?这样可以在需要时将它们快速绘制到屏幕上?
到目前为止,我已经实现了一个非常天真的算法,它将每个32x32图像加载到纹理中,并将其无限期地保存在内存中。 (纯粹的巧合我的图像的大小是2的幂。)它似乎工作,但我担心这是非常低效的,可能超过旧设备上的GPU资源或其他东西。
我知道TextureAtlas,但这似乎只适用于打包并存储在已编译的Android应用程序中的静态图像。当我通过网络动态接收图像时,我相信这对我不起作用。
我发现这篇libgdx SpriteBatch render to texture帖子建议将许多小图片渲染到FrameBuffer中,然后将其用作TextureRegions的来源。这似乎对我很有希望。这是一个好的解决方案吗? 还有更好的方法吗?
我也想知道将我的小图像绘制并存储到大型Pixmap中可能会有所帮助。如上所述,这可能是比绘制FrameBuffer更好的方法吗? 正如我从文档中理解的那样,Pixmaps纯粹是基于内存的。这可能是一个优势,因为它可能不需要图形资源,另一方面可能更慢,因为加载到纹理是一个昂贵的操作。对此的想法?
答案 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的!