4

私のコードは正常にコンパイルされているようですが、実行しようとすると非常にハングします。

私は、Riemers XNA チュートリアルhereに従っています。

私は C# にはかなり精通していますが、決して専門家ではありません。これまでのところ、これを機能させるのに問題はありませんでした。エラーや例外がスローされることもありません...ハングアップするだけです。私は彼の関連フォーラムを読んだことがあります。ユーザーは、通常はタイプミスやコード エラーに関連する他の問題について話し合っていましたが、そこにはこのようなものは何もありません...誰もが正常に実行できるようです.

おそらく何か間違ったことはありますか?一番下のネストされた for ループは、私には少し扱いが難しいように思えます。screenWidth と screenHeight は 500 と 500 です。

ところで: これは LoadContent オーバーライド メソッドから実行されるため、私の知る限り一度だけ実行する必要があります。

    private void GenerateTerrainContour()
    {
        terrainContour = new int[screenWidth];

        for (int x = 0; x < screenWidth; x++)
            terrainContour[x] = screenHeight / 2;
    }

    private void CreateForeground()
    {
        Color[] foregroundColors = new Color[screenWidth * screenHeight];

        for (int x = 0; x < screenWidth; x++)
        {
            for (int y = 0; y < screenHeight; y++)
            {
                if (y > terrainContour[x])
                    foregroundColors[x + y * screenWidth] = Color.Green;
                else
                    foregroundColors[x + y * screenWidth] = Color.Transparent;
                fgTexture = new Texture2D(device, screenWidth, screenHeight, false, SurfaceFormat.Color);
                fgTexture.SetData(foregroundColors);
            }
        }
    }
4

2 に答える 2

6

おそらく、250,000の画面サイズのテクスチャ(聖なるモリー)を作成しているという事実と関係があります!

特にサウンドや画像などのメディアを扱う場合は、リソースの割り当てが常に重くなります。

ここで本当に必要なテクスチャは1つだけのようですfgTexture = new Texture2D(device, screenWidth, screenHeight, false, SurfaceFormat.Color);。ループの外側に移動してみてください。次にfgTexture.SetData(foregroundColors);、ループの外側にも移動してみてください。

private void CreateForeground()
{
    Color[] foregroundColors = new Color[screenWidth * screenHeight];

    fgTexture = new Texture2D(device, screenWidth, screenHeight, false, SurfaceFormat.Color);

    for (int x = 0; x < screenWidth; x++)
    {
        for (int y = 0; y < screenHeight; y++)
        {
            if (y > terrainContour[x])
                foregroundColors[x + y * screenWidth] = Color.Green;
            else
                foregroundColors[x + y * screenWidth] = Color.Transparent;
        }
    }

    fgTexture.SetData(foregroundColors);
}
于 2012-07-03T20:30:28.390 に答える
3
for (int x = 0; x < screenWidth; x++)
  {
    for (int y = 0; y < screenHeight; y++)
    {
      if (y > terrainContour[x])
        foregroundColors[x + y * screenWidth] = Color.Green;
      else
        foregroundColors[x + y * screenWidth] = Color.Transparent;
    }
 }

 foregroundTexture = new Texture2D(device, screenWidth, screenHeight, false, SurfaceFormat.Color);
 foregroundTexture.SetData(foregroundColors);

問題は最後の 2 行にあります。ループでは、500 x 500 の Texture2Dオブジェクトを作成しているため、速度が低下しています。それらを for ループの外に移動します。

于 2012-07-03T20:32:58.340 に答える