3

だから私はタイル画像を使って横スクロールゲームを作っています。常に、このコードを使用して少なくとも120枚の画像が描画されています。

for (int mapX = 0; mapX < mapWidth; mapX++)
{
    for (int mapY = 0; mapY < mapHeight; mapY++)
    {
        try
        {
            Block block = mapList[mapY, mapX];

            if (block == null)
                continue;

            if (block.nullspace)
                continue;

            block.Interact();

            int drawX = sceneX + block.blockX;
            int drawY = sceneY + block.blockY;

            if (drawX + block.blockWidth < 0)
                continue;
            else if (drawX > this.ClientSize.Width + 50)
                break;

            if (drawY + block.blockHeight < 0)
                continue;
            else if (drawY > this.ClientSize.Height)
                break;

            e.Graphics.DrawImage(block.blockImage, drawX, drawY, block.blockWidth, block.blockHeight);

            if (block.overlayImage != null && !block.dontDraw)
                e.Graphics.DrawImage(block.overlayImage, sceneX + block.blockX, sceneY + block.blockY, block.blockWidth, block.blockHeight);
        }
        catch (Exception)
        {
        }
    }
}

ただし、このコードは、画像を移動する必要があるたびに実行されます。たとえば、シーン全体を移動させるために、10間隔のタイマー(移動をスムーズに保つため)を使用して、sceneX(シーンを左に移動しているため)をデクリメントしてから、シーン全体を再描画します。つまり、基本的に、10ティックごとに約120枚の画像が再描画されます。これにより、プログラムはコンピューターのCPU使用率の約40%に達します。

基本的に私の質問は、「たくさんの画像タイルを描画して移動する最も効率的な方法は何ですか」です。

描画されているシーンの画像は次のとおりです。 シーンの画像

4

5 に答える 5

2

グラフィックはソフトウェア モードでレンダリングされるため、CPU に過負荷をかけるだけです。

MonoGame を使用してください。使い始めるのは非常に簡単です。https://github.com/mono/MonoGameで描画を処理し、ゲームの仕組みについて少し学びます: http://xnagpa.net/xna4rpg.php

MonoGame は Direct3D と OpenGL の両方をサポートし、グラフィックはハードウェアで高速化され、単純な 2D シーンをレンダリングするときに速度が低下することはありません。

于 2013-02-20T14:55:11.337 に答える
1

XNA。Windowsフォームのこの段階では、Microsoft XNAライブラリの使用方法に大きな違いはなく、DirectXやハードウェアアクセラレーションなどを心配することなく利用できるため、結果はより良くなります。それについて。(XNAはゲーム/グラフィックス用に設計されているため、コードはより高速になり、読み取り/書き込みがより自然になります...このようなものはXNAの目標の1つです。)

XNAは、C#の学習に非常に自然に適合し(Microsoftによって作成されたため)、Visual Studioで非常にうまく機能し、無料で、オンラインでたくさんのチュートリアルがあります。

于 2013-02-20T15:02:18.567 に答える
1

最初にすべきことは、マップのどの範囲が画面に表示されるかを決定することです。現在、次のものがあります。

for (int mapX = 0; mapX < mapWidth; mapX++)
{
    for (int mapY = 0; mapY < mapHeight; mapY++)

したがって、個々の正方形が表示されているかどうかを確認するために、世界全体に対してループを実行しています。ループの前に制限を決定することで、作業量を減らすことができます。そうすれば、ループを次のように制限できます。

for (int mapx = startVisibleX; mapX <= endVisibleX; mapX++)
{
    for (int mapY = startVisibleY; mapY <= endVisibleY; mapY++)

ワールドが画面よりもはるかに大きい場合は、不要な処理を大幅に節約できます。

レンダリングの速度が問題になる場合は、他の回答のアドバイスに耳を傾け、DirectX、MonoGame、または別のレンダリング ライブラリを調べることを強くお勧めします。

于 2013-02-20T15:00:42.070 に答える
0

レンダリング目的で DirectX を使用することを検討する必要があります。これは、Windows でゲームを開発する場合のベスト プラクティスです。

http://msdn.microsoft.com/en-us/library/windows/apps/hh452790.aspx

于 2013-02-20T14:55:22.510 に答える
-1

TranslateTransformを使用して画像を表面上で移動することを検討してください。これにより、パフォーマンスがいくらか向上するはずです。

于 2013-02-20T15:00:03.057 に答える