由于性能问题,我不得不将我的地图切成块。 我管理的地图以这样的方式如何做“地图块”,比如terraria或我的世界地图?
listMap[x][y] = new Tile (x,y);
我妄图切断这个名单几个“块”,以避免加载所有的地图,因为FPS不是很高大的地图。然而,当我更新或绘制时,我会用一个小块范围来做。这里是我如何进行:
foreach (List<Tile> list in listMap)
{
foreach (Tile leTile in list)
{
if ((leTile.Position.X < screenWidth + hero.Pos.X) &&
(leTile.Position.X > hero.Pos.X - tileSize) &&
(leTile.Position.Y < screenHeight + hero.Pos.Y) &&
(leTile.Position.Y > hero.Pos.Y - tileSize)
)
{
leTile.Draw(spriteBatch, gameTime);
}
}
}
(和同样的事情,更新方法)。
因此,我尝试学习像Minecraft或terraria这样的游戏,并且任何两个管理的地图都比我的大得多,而没有fps的下降。显然,他们加载“块”。
我想了解的是如何在Chunk中剪切我的列表,以及如何根据角色的位置来显示。我尝试了许多没有成功的事情。
非常感谢您让我走上正轨!
PS:再一次,对不起,我的英语:“( PPS:我不是一个实验开发;)
编辑:
感谢IVlad,我获得了10 fps的改变就像循环这个:
for (int x = (int)(hero.Pos.X)/tileSize; x < (hero.Pos.X/tileSize) + (int)(screenWidth/tileSize); x++)
{
for (int y = (int)(hero.Pos.Y)/tileSize; y < (hero.Pos.Y/tileSize) + (int)(screenHeight/tileSize); y++)
{
if (x >= 0 && y >= 0 && x <= tileXMax && y <= tileYMax) {
grille[x][y].Draw(spriteBatch, gameTime);
}
}
}
尽管如此,fps仍然很低,取决于地图的大小,而不是可见瓦片的数量。
究竟发生了什么问题?它是否渲染了太多的瓷砖?你的方法似乎是正确的,因为你只需要在屏幕上实际渲染瓷砖。 – 2012-03-18 13:11:19
@SimeonVisser这是非常错误的fps。事实上,当我创建一个太大的地图时,Fps非常低(1或2 fps)。我认为,所有的列表都是“加载”的,并且游戏不太喜欢它:/。 – 2012-03-18 13:15:50
尽管您仅在屏幕上实际绘制切片,但如果我没有弄错,则会迭代地图上的所有切片。难道你不应该找到你的角色所在的瓦片,只能在瓦片周围迭代足够的瓦片吗? – IVlad 2012-03-18 13:16:19