【发布时间】: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 进行剔除以进行渲染..