我开始研究libgdx中的terraria克隆并获得了tile生成。瓷砖以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分钟。我知道这是一个很大的数字,但我很好奇terraria(或任何其他克隆)如何设法缩短时间。谢谢!
编辑:这是块类(http://pastebin.com/SFCkJKur)和实体类(http://pastebin.com/w3ay2nkb)。
答案 0 :(得分:2)
Chunk
和Block
课程的目的是什么?它们是用于渲染吗?因为当你想到它时,你不需要来做到这一点。你真的只需要渲染当前时刻玩家可见的磁贴,而不再需要了。
这种性质的游戏确定了播放器的当前位置,然后确切地计算出需要渲染的块/块以及位置。
以下是两个很好的资源来帮助您开始这个问题:
另一方面,Chunk
和Block
类只是用于包含构成世界的数据吗?在这种情况下,您也不需要初始化它们。您应该以更轻量级的方式存储数据 - 可能在文件系统中。
答案 1 :(得分:0)
你在你的问题中提出了libgdx,这个引擎附带了一个精心设计的Map API,可以处理Tile地图并提供其他有用的功能:
关于Libgdx官方WIKI:
性能考虑因素
虽然我们尽可能快地制作渲染器,但有一个 您可以考虑采取一些措施来提高渲染性能。
仅使用图层中单个图块集中的图块。这会减少 纹理绑定。将不需要混合的拼贴标记为不透明。在 在你只能以编程方式执行此操作的那一刻,我们将提供方法 在编辑器中或自动执行此操作。不要过火了 层数。
查看 here 了解更多信息