2011-10-02 6 views
1

1bpp 이미지로 작업해야하는 "성능에 치명적인"작업이 있습니다. 사실 저는 Bitmap 클래스를 사용하고 있습니다. 그래픽 업데이트 사이클의 각 반복, 바이트 배열 내부의 비트 맵 복사본입니다.1bpp 이미지 작업

내 작업 관리자를보고,이 일을 계속할 수있는 것은 아니며, 항상 2 %의 CPU를 사용합니다. 유틸리티 프로그램과 같이 꽤 많이 사용한다고 생각합니다.

나는 가능한 한 적은 메모리와 거의 0 cpu를 낭비해야한다. 이미지는 160x43이며 아주 작습니다.

왜 내가 바이트 배열을 직접 사용하지 않습니까? 쉬운 : 나는 그것을 쓰고 싶다. 나 자신이 다시 쓰고 싶지 않은 몇 가지 일반적인 작업을 수행한다.

난 다른 이미지 클래스를 사용할 수 있습니다 (예 : wpf에서 알 수 없음). 1bpp 이미지로 작업 할 수있는 가능성이 필요합니다.

논외가 바이트 배열 동안 내가 32bpp의 이미지와 같은 "문제"가, 내가 이미지로 작업하는 방법이 필요합니다, 나는 나의 바이트 각각의 복사본을 만들 수 없습니다 시각!!! 이런 식으로 CPU를 낭비하고 있습니다.

+1

2 %는 상당히 많습니까? 아주 가벼운 것 같습니다. 왜 100 % 작동하지 않습니까? 고의적으로 속도를 늦추 시나요? – spender

+0

나는 그것을 늦추는 것을 숙고하고있다. 그러나 나는 이것이 유틸리티이고 백그라운드에서 작동한다고 말했기 때문에, 가능한 한 적은 CPU를 사용하기로되어있다. 이 라이브러리로 작업하는 다른 프로그램은 cpu (거의 아무것도)를 사용하지 않으며, C++로 작성된 것이므로 메모리 관리가 더 좋습니다. 메모리를 아주 잘 제어 할 필요는 없습니다.하지만이 유틸리티는 게임 실행 중에도 작동하기 때문에 CPU 사용을 제어해야합니다. –

+2

@spender (배경이되어야 함) 앱, 2 % 상수 CPU로 나를 괴롭히는 데 충분합니다. – driis

답변

4

고정 된 비트 맵의 ​​기본 메모리를 얻으려면를 사용해야합니다 (친숙한 가비지 수집기가 사용자를 대신하여 이동하지 않도록). 일례로서

이 적은 프로그램은 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

글쎄, 내가 바이트 배열을, C#을 배열을 말은, 안 C++ 바이트 배열 (Marshal.StructToPointer 메서드를 사용하고 싶습니다) –

+0

그것은 C# 포인터, C++ 바이트 배열과 관련이있다 . – driis

+0

... 포인터로 가지고 있다면 어쨌든'Marshal.StructToPointer'는 필요 없습니다. 마샬 (marshal) 메서드는, 당신에게'byte []'를 주겠지 만, 당신이 원하지 않는 데이터를 복사합니다. – driis

관련 문제