由於性能問題,我不得不將我的地圖切成塊。 我管理的地圖以這樣的方式如何做「地圖塊」,比如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