2013-01-14 77 views
0

的。當我在XNA遊戲截圖做,每個texture.SaveAsPng佔用一些內存,它似乎並沒有返回到遊戲。所以最終我耗盡了內存。我試過紋理數據保存到FileStreamMemoryStream,希望我可以從那裏保存爲Bitmap,但結果是一樣的。有沒有辦法來強制釋放此內存或者一些解決方法,可以讓我得到的圖像數據,並保存它,而不會在內存溢出異常一些其他的方式?挽救了許多截圖依次用Texture2D.SaveAsPng導致內存不足的異常

sw = GraphicsDevice.Viewport.Width; 
sh = GraphicsDevice.Viewport.Height; 

int[] backBuffer = new int[sw * sh]; 
GraphicsDevice.GetBackBufferData(backBuffer); 
using(Texture2D texture = new Texture2D(GraphicsDevice, sw, sh, false, 
    GraphicsDevice.PresentationParameters.BackBufferFormat)) 
{ 
    texture.SetData(backBuffer); 
    using(var fs = new FileStream("screenshot.png", FileMode.Create))   
     texture.SaveAsPng(fs, sw, sh); // ← this line causes memory leak  
} 
+0

你能張貼生產的「內存泄漏」的小例子嗎? –

+0

你可以在保存紋理的地方顯示代碼嗎? –

+0

紋理'Texture2D'? –

回答

2

你也許能夠創造直接從質地字節的位圖和繞過內部方法來檢查SaveAsPng泄漏或它的別的東西。

試試這個擴展方法(不幸的是我無法測試(在工作中沒有XNA),但它應該工作。)

public static class TextureExtensions 
{ 
    public static void TextureToPng(this Texture2D texture, int width, int height, ImageFormat imageFormat, string filename) 
    { 
     using (Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb)) 
     { 
      byte blue; 
      IntPtr safePtr; 
      BitmapData bitmapData; 
      Rectangle rect = new Rectangle(0, 0, width, height); 
      byte[] textureData = new byte[4 * width * height]; 

      texture.GetData<byte>(textureData); 
      for (int i = 0; i < textureData.Length; i += 4) 
      { 
       blue = textureData[i]; 
       textureData[i] = textureData[i + 2]; 
       textureData[i + 2] = blue; 
      } 
      bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); 
      safePtr = bitmapData.Scan0; 
      Marshal.Copy(textureData, 0, safePtr, textureData.Length); 
      bitmap.UnlockBits(bitmapData); 
      bitmap.Save(filename, imageFormat); 
     } 
    } 
} 

它有點粗糙,但你可以清理它(如果它甚至工作) 。

的最後但並非最不重要(如果所有其他嘗試都失敗了),你可以叫GarbageCollection自己,但不建議這樣做它的非常糟糕的做法。

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 

上面的代碼應該是LAST度假村只。

祝你好運。

+0

我直接前進,嘗試了GC方法,但不幸的是沒有工作。 – user1306322

+0

然後我做了108個截圖與您的代碼,並沒有消耗過每4096超過800兆字節×4096的圖像,雖然它花費了相當長的一段時間。非常感謝! – user1306322

+0

謝謝,這項工作很完美。 SaveAsPng內存泄漏正在造成我的項目 –