gpt4 book ai didi

c# - 怎么办 "map chunks",像泰拉瑞亚或我的世界地图?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:38 25 4
gpt4 key购买 nike

由于性能问题,我必须将我的 map 切割成 block 。我以这种方式管理 map :

listMap[x][y] = new Tile (x,y);

我试图将此列表分成几个“ block ”以避免加载所有 map ,但没有成功,因为大 map 的 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 这样的游戏,并且任何两个管理的 map 都比我的大得多,fps 没有丝毫下降。显然,它们加载“ block ”。

我想了解的是如何在 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 仍然很低并且取决于 map 的大小而不是可见图 block 的数量。

最佳答案

您应该做的第一件事是,就像使用 Draw 方法一样,只创建/加载靠近您的图 block 。这应该可以节省一些加载 map 的时间,也可以节省一些内存。

您可以做的第二件事是直接从外部绘制它们,而不是为图 block 使用 Draw 函数,并引用每个图 block 中的纹理,就像:

//in the load method...
tileTextures = //a list/dictionary with all textures for tiles

for (int x = minX; x < maxX; x++)
for (int y = minY; y < maxY; y++)
{
spriteBatch.Draw(tileTextures[list[x,y].TextureID], list[x,y].Position);
}

这可能有用也可能没用,具体取决于您处理数据的方式。

另一件可以帮助您的事情是关于 colid 矩形。如果您使用它来进行碰撞检测,也许最好自己进行检测,例如:

void CheckCollision(Rectangle character)
{
int size = 16;
if (character.Right > this.Position.X &&
character.Left < this.Position.X + size &&
character.Bottom > this.Position.Y &&
character.Top > this.Position.Y + size)
{
//Character is colliding with tile
}
}

基本上,在大 map 中,任何减少一个图 block 分配的内存量的东西都会很好。

关于c# - 怎么办 "map chunks",像泰拉瑞亚或我的世界地图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9758517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com