2016-04-18 77 views
0

什麼是用C#中的新數據重新繪製圖像的最有效內存方式?C#高效地用新數據重新繪製圖像

我使用的外部DLL分配一個字節緩衝區來保存我的(寬*高* bytePerPixel)像素數據,其中每個像素都是ARGB32格式。 DLL通過與硬件交互來自動更新該緩衝區,然後調用一個C#回調函數說明新數據已準備就緒。現在,我的顯示新數據的方案是

var bmp = new Bitmap(_size.Width, _size.Height, PixelFormat.Format32bppArgb); 
var bitmapData = bmp.LockBits(
       new Rectangle(new Point(0, 0), _size), 
       ImageLockMode.UserInputBuffer | ImageLockMode.WriteOnly, 
       PixelFormat.Format32bppArgb, 
       unmanagedByteDataPtr); 
bmp.UnlockBits(bitmapData); 
myGui.ImageCtrl.Image = bmp; 

這會創建一個新的位圖,每次都有一個內存/性能損失。由於我的圖像大小沒有變化,是否有更有效的方法來做到這一點?

回答

1

您正在使用錯誤的構造函數。只需直接從非託管的數據創建位圖,它會包裹的數據,而不是創建一個新的位圖只是爲了走馬上扔掉它:

new Bitmap(_size.Width, _size.Height, 4 * _size.Width, PixelFormat.Format32bppArgb, 
      unmanagedByteDataPtr); 
+0

感謝您的建議。我嘗試了這一點,但它似乎並沒有提高CPU而不是內存利用率。這個建議是不是每次都會創建一個新的位圖對象?據我所知,這兩種方法只是簡單地引用實際的非託管像素數據作爲緩衝區。所以,這導致我相信內存/ CPU使用率來自於我在每一幀上創建和處理位圖對象的事實。 –

+1

@PaulGrinberg你有沒有使用過探查器? 'Bitmap'對象本身沒有數據,它只是一個GDI +位圖的包裝,它只是引用你的內存位置,而不是複製它。也許你的問題只是在別的地方? – Luaan

+0

感謝您的建議。在意識到我的問題不是位圖創建之後,我開始尋找其他地方的內存泄漏並找到它。 –