c# GDI+ 꺼져!! BufferedGraphics

요즘세상에서 c#의 gdi가 c++의 gdi 보다 느리다라고 하는 사람들이 있습니다...
뭐 느릴수도 있겠죠...
근데 너무 우기는건 좀 아닌거 아닌가욤(먼소리지)
저는 mfc도 개발하고 c#도 개발하고..
사실 더 그래픽컬하고 gdi를 많이 쓰는건 c# 개발할때 였습니다...
처음에 c#으로 개발할때 paint 는 정말 못쓸정도였(!?)지만 방법이 없는건 아니었죠..
결국 사람들이 방법을 모르는거지 누가빠르고 누가 느리다라고 승질낼일은 아닌거 같네요..
글 옮기다가 갑자기 생각나서 몇자 추가해봅니다..






C# 에서 더블 버퍼링은 정말 간단하게 설정이 됩니다.
그것이 폼이든 판넬이든 말이죠.


this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

요 3줄이면 설정이 끝나죠( 저같은 경우는 form이나 panel, pictureBox를 상속받는 더블버퍼용 컨트롤을 새로 만들어서 사용합니다.)

그러나!

더블버퍼링을 위한( 꼭 위한은 아닙니다. 더블버퍼링을 사용하지 않더라도 ) GDI+ 의 성능 개선을 위한
graphics 객체가 있었으니 그 이름하여 BufferedGraphics !!!

보통 Paint 함수에서

Graphics g = e.Graphics ;

이런식으로 Graphic 객체를 생성하여서 사용하는데요...

BufferedGraphics는 약간 다릅니다.

Paint 부분 소스입니다.


 private void Paint(object sender, PaintEventArgs e)
        {
            if (isLoading)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke(new PaintEventHandler(this.Paint), new object[] { sender, e });
                    return;
                }


                using (BufferedGraphics bufferedgraphic = BufferedGraphicsManager.Current.Allocate(e.Graphics, this.ClientRectangle))
                {
                    bufferedgraphic.Graphics.Clear(Color.Silver);
                    bufferedgraphic.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                    bufferedgraphic.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                    bufferedgraphic.Graphics.TranslateTransform(this.AutoScrollPosition.X, this.AutoScrollPosition.Y);

                    Pen p = new Pen(Color.FromArgb(111, 91, 160), 3);
                    bufferedgraphic.Graphics.DrawLine(p, 0 , 0 , 100 , 100);
                    p.Dispose();
             
                    bufferedgraphic.Render(e.Graphics);

    }

}

}

머 대충 이런식이군요.
graphics 객체에 직접 쓰는 방식이 아닌 BufferedGraphics 즉 메모리에 그린후 Rendering 하는 방식입니다.
현재 저 같은 경우는 엄청난 양의 그래픽을 그리고 있는데요(정말 엄청난... -_-)

확실히 그리는 속도와 갱신속도의 차이가 나는군요!!

이 방법은 무조건 쓰게 될듯합니다 ㅎㅎㅎ

댓글

  1. 훌륭한 내용 잘일었습니다.^^

    답글삭제
  2. 와... 이렇게 할 수 있군요 잘 배우고 갑니다~!

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

c# 에서 C++ dll 사용하기

MFC 레지스트리 읽고 쓰기