xna游戏工作室中的延迟c#代码问题

时间:2012-07-03 20:28:20

标签: c# xna

我的代码似乎编译好了,但是当我尝试运行它时,它的挂起非常糟糕。

我一直在跟随Riemers XNA教程here

我对C#非常熟悉,但绝不是专家。到目前为止,我没有遇到任何问题,并且没有任何错误或异常被抛出......它只是挂断了。我在他的相关论坛上看过,用户讨论过其他问题,通常与拼写错误或代码错误有关,但那里没有这样的东西......每个人似乎都可以运行得很好。

或许我做错了吗?底部的嵌套for循环对我来说似乎有点笨拙。 screenWidth和screenHeight分别为500和500。

BTW:这是从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);
            }
        }
    }

2 个答案:

答案 0 :(得分:6)

可能与您正在创建250,000个屏幕大小的纹理(神圣的moly)这一事实有关!

资源分配总是很重 - 尤其是当您处理声音和图像等媒体时。

看起来你真的只需要一个纹理,尝试在循环之外移动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);
}

答案 1 :(得分: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);

您的问题出在最后两行。在你的循环中,你正在创建 500 x 500 Texture2D个对象,这会减慢你的速度。将它们移到for循环之外。