パフォーマンスを向上させるために、画面にタイルのみを描画する必要があります。これを行うための実行可能な方法は何ですか?
私はこれを試してみましたが、解決できないバグが発生しました。
//world position to start drawing from
int sPosX = (int)(cam.Position.X - (device.Viewport.Width / 2));
int sPosY = (int)(cam.Position.Y - (device.Viewport.Height / 2));
//tile position to start drawing from
int sTileX = (int)((sPosX + (2*sPosY) - (Map.TileWidth/2)) / Map.TileWidth -1);
int sTileY = (int)((sPosX - (2 * sPosY) - (Map.TileHeight / 2)) / -Map.TileWidth - 1);
//amount of rows/collumns to draw
int rowCount = (int)(device.Viewport.Height / (Map.TileHeight / 2) + 2);
int colCount = (int)(device.Viewport.Width / Map.TileWidth + 2);
//current tile to draw
int tileX;
int tileY;
for (int row = 0; row < rowCount; row++)
{
for (int col = 0; col < colCount; col++)
{
tileX = sTileX + col + (int)((row / 2));
tileY = sTileY - col + (int)((row / 2));
if (tileX >= 0 && tileX < tileMap.GetLength(0) && tileY >= 0 && tileY < tileMap.GetLength(1))
{
batch.Draw(grid, new Rectangle((tileX * (TileWidth / 2)) - (tileY * (TileWidth / 2)), (tileX * (TileHeight / 2) + (tileY * (TileHeight / 2))), TileWidth, TileHeight), Color.White);
batch.DrawString(tiny, tileX + "," + tileY, new Vector2(tileX * (TileWidth / 2) - (tileY * (TileWidth / 2)) + 24, tileX * (TileHeight / 2) + (tileY * (TileHeight / 2)) + 12), Color.White);
}
}
}
ここでは、タイルマップを行ごとに描画してみます。最初に描画する最初のタイル (左上隅) を特定し、次に描画する必要がある列と行の数を特定します。
最初はフロートのみを操作し、最後の瞬間にキャストしてフロートを段階的に int に変換しながら、画面上で完全な X=0 行と完全な Y=0 行を取得できましたが、残りはまだ表示されていましたこの絵のように。
カメラを動かしている間、表示/レンダリングされたタイルは不均一と偶数の間で切り替わります。そのため、突然少し下に移動すると、画像に表示されているすべてのタイルが消え、空白が表示されます。さらに移動すると逆になり、移動し続けると、これら2つの状態の間でちらつきます。(行/ 2)と関係があると思いましたが、修正できないようです。
どのタイルを描画するかを計算する方法は良いようです。ズームアウトするとこれが得られます(ズームしても数式はまだ変更されていません)。下の図では、他のタイルが描画されている 2 番目の状態も確認できます。