2011-10-02 71 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