MFC

[Gdiplus::Graphics] 최적화 관련 팁 정리

Dongjun_ 2025. 2. 18. 18:01

사내 신규 개발항목에서 성능이슈가 발생했다.

그래서 끌려갔다 ( 거 그만좀 갖다 써... )

 

주요 내용은 Gdiplus::Graphics 항목으로 DrawImage 대상이 늘어나면 성능하락이 심각하다는 것이다.

이에 관련해 찾아본 내용을 간단하게 정리해둔다.

 

 

  • Gdiplus::CompositingMode 설정: 투명도(alpha)가 없는 불투명한 비트맵(특히 32비트 비트맵의 경우)을 사용하는 경우, DrawImage() 호출 전에 Graphics.CompositingMode를 CompositingMode.SourceCopy로 설정하세요. 그래야 픽셀 단위의 불필요한 혼합 계산을 건너뛸 수 있습니다. 설정 후에는 꼭 원래 값으로 되돌려주세요. 그렇지 않으면 일반적인 드로잉 프리미티브가 보기 흉하게 보일 수 있습니다.
  • Gdiplus::InterpolationMode 설정: InterpolationMode.HighQualityBicubic 같은 모드로 설정하지 마세요. NearestNeighbor를 사용하는 것이 가장 빠르지만, 확대/축소가 필요한 경우에는 2배, 3배, 4배 등 정수 배율이 아닌 경우 외관이 좋지 않을 수 있습니다. Bilinear는 일반적으로 좋은 타협점이 됩니다. 비트맵 크기와 그리는 영역의 크기가 일치하는 경우에는 반드시 NearestNeighbor만 사용하세요.
  • OnPaint()에서 그리기: Graphics 객체에 그리기 작업을 항상 OnPaint()에서 수행하세요. 만약 영역을 다시 그려야 하는 경우 Invalidate()를 호출하고, 즉시 그리기 작업이 필요할 경우 Invalidate() 후 Update()를 호출하세요.
  • Control.CreateGraphics() 사용 지양: Control.CreateGraphics()를 사용하지 마세요. OnPaint()에서 제공된 Graphics 객체를 사용하여 그리기를 수행하세요.
  • Paint 이벤트 핸들러 대신 OnPaint() 사용: Paint 이벤트 핸들러를 사용하지 말고, 컨트롤에서 파생된 클래스에서 OnPaint()를 구현하세요. PictureBox나 UserControl 등 다른 클래스에서 파생되는 것은 부가적인 오버헤드만 추가될 뿐입니다.

 

이 내용중 가장 핵심은 OnPaint 였다.

도대체 왜인지 모르겠는데 OnPaint 가 아니라 OnDraw 에서 Draw 관련 함수를 호출시키던데

호출하던 내용을 OnPaint 로 변경하니 속도 향상좀 되더라.

 

되게 당연한 내용인데 반복적으로 사용될 Image 파일은 1번만 생성해둬야 한다.

그걸 안하고 Draw 함수 안에서 생성, 그리기 둘다 하고 있더라...

반응형

'MFC' 카테고리의 다른 글

char, wchar, tchar 에 대해서  (0) 2019.01.22
LP, T, C, STR 등에 대하여  (0) 2019.01.22
[MFC] TCHAR에 관하여  (0) 2019.01.22