2012-07-03 72 views
4

我的代碼似乎編譯好,但是當我嘗試運行它時,它掛起非常糟糕。問題在xna遊戲工作室laggy c#代碼

我一直在關注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); 
      } 
     } 
    } 

回答

6

可能與您創建250,000個屏幕大小的紋理(聖莫里)有關!

資源分配總是很重 - 特別是在處理聲音和圖像等媒體時。

看起來你真的只需要一個紋理,試着在循環之外移動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); 
} 
+0

我從LoadContent覆蓋方法運行該代碼......它應該只在遊戲啓動時運行一次? – impyre

+0

打我吧! :P –

+1

是的,發現並修改了 - 仍然這是你的滯後的可能原因:) – MattDavey

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 500Texture2D對象,這會減慢您的速度。將它們移到for循環之外。