【问题标题】:libGDX: Best way to store many small images in libGDX for fast drawinglibGDX:在 libGDX 中存储许多小图像以进行快速绘图的最佳方式
【发布时间】:2016-07-23 00:36:06
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: libgdx


    【解决方案1】:

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

    看看

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

    TextureAtlas 的方法。它使动态创建图集成为可能。

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

        TextureAtlas atlas = new TextureAtlas();
    

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

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

    那么您可以通过findRegion 或其他方法使用您的图集(查看参考)


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

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

    【讨论】:

    • 感谢您指出这一点。虽然使用 FrameBuffers 似乎工作得相当好(已经测试过),但这看起来是一个更简单的解决方案。
    • 看了TextureAtlas的源代码后,我相信它只不过是把我成千上万的小纹理存储在一个数组中。这只是我隐藏在漂亮外观后面的幼稚实现 :-) 我将继续使用我的 FrameBuffer 实现,因为这确实大大减少了 Texture 对象的数量。
    • 其实不是 :) 使用 textureatlas 的原因是只使用一个大纹理 - 当您渲染事物时,您需要做的第一件事是将图形发送到 GPU,这会影响性能。使用textureatlas,您只发送一次纹理。 Google for SpriteBatch 的 render calls
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2014-11-16
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多