私はこの問題の回避策をあらゆる場所で探しました (解決策が転がっているのが見えないだけかもしれません)。私のゲームは現在、画面上にタイルマップをレンダリングしていますが、実際には画面の境界内にないタイルはレンダリングしません。ただし、各タイルは 16x16 ピクセルです。つまり、画面上のすべてのピクセルに解像度 1920x1080 のタイルが含まれている場合、8100 個のタイルを描画する必要があります。
サイクルごとに多くのタイルを描画すると、私の FPS は本当に死んでしまいます。解像度 800x600 で実行すると、FPS は ~20 になり、1920x1080 では約 3 ~ 5 FPS で実行されます。これは本当に私を夢中にさせます。
スレッド化と非同期タスクの使用を試みましたが、画面がちらつくだけです。おそらく私が間違ってコーディングしているだけです。
これが私が現在使用している描画コードです。
// Get top-left tile-X
Vector topLeft = new Vector(Screen.Camera.X / 16 - 1,
Screen.Camera.Y / 16 - 1);
Vector bottomRight = new Vector(topLeft.X + (Screen.Width / 16) + 2,
topLeft.Y + (Screen.Height / 16) + 2);
// Iterate sections
foreach (WorldSection section in Sections)
{
// Continue if out of bounds
if (section.X + ((Screen.Width / 16) + 2) < (int)topLeft.X ||
section.X >= bottomRight.X)
continue;
// Draw all tiles within the screen range
for (int x = topLeft.X; x < bottomRight.X; x++)
for (int y = topLeft.Y; y < bottomRight.Y; y++)
if (section.Blocks[x - section.X, y] != '0')
DrawBlock(section.Blocks[x - section.X, y],
x + section.X, y);
}
8 ~ 12 のセクションがあります。各タイルは、2 次元配列の char オブジェクトで表されます。
描画ブロックの方法:
public void DrawBlock(char block, int x int y)
{
// Get the source rectangle
Rectangle source = new Rectangle(Index(block) % Columns * FrameWidth,
Index(block) / Columns * FrameHeight, FrameWidth, FrameHeight);
// Get position
Vector2 position = new Vector2(x, y);
// Draw the block
Game.spriteBatch.Draw(Frameset, position * new Vector2(FrameWidth, FrameHeight) - Screen.Camera, source, Color.White);
}
Index() メソッドは、char に対応するタイルのフレーム インデックスを返すだけです。
この方法でフレームレートを犠牲にすることなく、実際にこれだけ多くを一度に描画できるようにする方法を考えています。私が提供したコードは明らかにあまり最適化されていませんか?それとも、パフォーマンスを低下させずにこれほど多くの個々のタイルを描画できるようにするために何か特別なことをしなければなりませんか?