【问题标题】:Libgdx Terraria clone world takes too long to createLibgdx 泰拉瑞亚克隆世界创建时间太长
【发布时间】:2016-03-20 01:36:46
【问题描述】:

我开始在 libgdx 中制作一个 terraria 克隆并生成图块。瓷砖被分成 16x16 块,但生成所有块需要太长时间。目前,我正在生成 400 个块(102400 个图块)。这是我生成块的方式:

data = new int[width][height];
    for(int y = 0; y < height; y++){
        for(int x = 0; x < width; x++){
            data[x][y] = 1;
        }
    }
    chunks = new Chunk[chunks_x][chunks_y];
    for(int y = 0; y < chunks_y; y++){
        for(int x = 0; x < chunks_x; x++){
            chunks[x][y] = new Chunk(x, y, this);
        }
    }

Chunk 类中的平铺生成代码:

tiles = new Block[World.chunkSize][World.chunkSize];
    for(int vy = 0; vy < World.chunkSize; vy++){
        for(int vx = 0; vx < World.chunkSize; vx++){
            if(world.GetTile(vx + x * World.chunkSize, vy + y * World.chunkSize) >= 1)
                tiles[vx][vy] = new Block(vx * 16 + x * World.chunkSize * 16, vy * 16 + y * World.chunkSize * 16, world.data[x * World.chunkSize + vx][y * World.chunkSize + vy]);
        }
    }

生成这样大小的世界大约需要 2 分钟以上。我知道这是一个很大的数字,但我很好奇泰拉瑞亚(或任何其他克隆)如何设法缩短时间。谢谢!

编辑:这是块类(http://pastebin.com/SFCkJKur)和实体类(http://pastebin.com/w3ay2nkb)。

【问题讨论】:

  • 你确定有 102400 块瓷砖?我已经生成了更大的地图,其中包含超过一百万个图块用于测试目的,它们会在几秒钟内加载。我猜你做 16x16x400 所以那将是 102400。在你当前发布的代码中看不到任何奇怪的东西,这些瓷砖有多大(以字节为单位)?你能展示完整的瓷砖类吗?如果您要在其中存储诸如纹理数据之类的东西,那将是一个瓶颈。
  • 您正在内存上创建 102400 个纹理,当您尝试渲染时,opengl 会发疯地加载和重新加载相同的纹理,只需使用 wrapped texture 使用 asset manager 并让您的实体使用用于渲染的 TextureRegion,我还创建了一个 fallout_shelter/terraria/dwarf 堡垒克隆,在less than a second 中加载了一百万个图块,在没有 GPU 的 PC 上以稳定的 60 fps 进行剔除以进行渲染..

标签: java libgdx chunks


【解决方案1】:

ChunkBlock 类的用途是什么?它们是用来渲染的吗?因为当您考虑它时,您不需要 这样做。您实际上只需要渲染当前对玩家可见的图块,仅此而已。

许多这种性质的游戏所做的是确定玩家的当前位置,然后准确计算需要渲染哪些图块/块以及在哪里。

这里有两个很好的资源可以帮助您开始解决这个问题:


另一方面,ChunkBlock 类是否仅用于包含构成世界的数据?在这种情况下,您也不需要初始化它们。您应该以更轻量级的方式存储数据 - 也许在文件系统中。

【讨论】:

    【解决方案2】:

    您在问题中提到了 libgdx,这个引擎带有一个制作精良的 Map API,可以处理 Tile 地图并提供其他有用的功能:

    关于 Libgdx 官方 WIKI:

    性能考虑

    虽然我们尝试使渲染器尽可能快,但有一个 您可以考虑几件事来提高渲染性能。

    仅使用图层中单个图块集中的图块。这将减少 纹理绑定。将不需要混合的瓷砖标记为不透明。在 当您只能以编程方式执行此操作时,我们将提供方法 在编辑器中或自动执行此操作。不要过度使用 层数。

    查看here了解更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2019-01-30
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多