2

パフォーマンスを向上させるために、画面にタイルのみを描画する必要があります。これを行うための実行可能な方法は何ですか?

私はこれを試してみましたが、解決できないバグが発生しました。

//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 番目の状態も確認できます。

ここに画像の説明を入力

4

1 に答える 1

2
tileX = sTileX + col + (int)((row / 2) + (row%2));

モジュラスはそれを修正します。これは、2 行目ごとに、最初の行に加えて 1 ずつ増やす必要があるためです。

それでも、これを適切に行う方法を見つけるのに何時間も費やし、最終的に自分で行うことになったので、これは貴重な情報だと思います. これは、ダイヤモンド スタイルのアイソメ マップをジグザグの正方形としてレンダリングできるため、すべてを描画する最も効率的な方法だと思います。

于 2013-06-02T14:23:54.883 に答える