2011-10-02 33 views
1

我有一個「性能關鍵」的操作,我需要與1bpp映射圖像的工作。 其實我正在使用位圖類,我正在做,圖形更新週期的每個迭代,字節數組內的位圖的副本。與1bpp映射圖像工作

看着我的任務管理器,這不是我能繼續這樣做:它使用2%的CPU所有的時間,我認爲這是相當多的東西,像一個實用程序。

我需要浪費更少的內存儘可能和幾乎爲0的CPU。圖像是160x43,非常小。

我爲什麼不直接使用字節數組?簡單:我想寫一遍,做一些我不想自己重寫的常見操作。

我可以obviusly使用不同的圖像類(從WPF例如,我不知道)。我需要使用1bpp圖像的可能性。

Offtopic: 我有同樣的「問題」與32bpp的形象,我需要一種方法與它的工作作爲一個圖像,而這是一個字節數組,我不能讓每個字節我一份時間!!!我正在以這種方式浪費CPU。

+1

2%是不是很多?對我來說似乎很輕。爲什麼它不以100%運行?你故意放慢速度嗎? – spender

+0

我正在考慮放緩它,但正如我所說這是一個實用程序並在後臺工作,它應該儘可能少使用cpu。其他使用這個庫的程序不使用cpu(幾乎沒有),它們通常用C++編寫,所以你有更好的內存管理。我不需要很好地控制內存(我們有很多可用),但是我需要控制CPU使用率,因爲即使在遊戲執行過程中,該實用程序也應該可以工作 –

+2

@spender,如果這應該是背景應用程序,2%恆定的CPU將足以讓我惱火。 – driis

回答

4

您應該使用Bitmap.LockBits獲得固定的位圖(如此友好的垃圾回收器不會移動它給你)的底層內存。

作爲一個例子,這個小程序載入一個PNG,設置一個簡單的像素圖案,並保存所得到的圖像:

unsafe void Main() 
{ 
    Bitmap bm = (Bitmap)Image.FromFile("D:\\word.png"); 
    var locked = bm.LockBits(new Rectangle(0,0,bm.Width, bm.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format1bppIndexed); 
    try 
    { 
     byte v = 0xaa; 
     byte* pBuffer = (byte*)locked.Scan0; 
     for(int r = 0 ; r < locked.Height ; r++) 
     { 
      byte* row = pBuffer + r*locked.Stride; 
      for(int c = 0 ; c < locked.Stride ; c++) 
       row[c] = v; 
     } 
    } 
    finally 
    { 
     bm.UnlockBits(locked); 
    } 
    bm.Save("D:\\generated.png"); 
} 

LockBits將具有取決於它是否需要內部存儲器表示轉換的開銷根據你的要求(所以你可以從哪裏得到它)。作爲性能,測量和配置文件的alwyas來查找瓶頸。

+0

嗯,我需要一個byte []數組,我的意思是C#數組,而不是C++字節數組(因爲我想使用Marshal.StructToPointer方法) –

+0

它是一個C#指針,與C++字節數組無關。 – driis

+0

...如果你將它作爲一個指針,反正你不需要'Marshal.StructToPointer'。 Marshal方法可以讓你得到一個'byte []',複製數據,這就是你所說的你不想要的。 – driis