테닝베어의 나날

[C# 윈폼] 그래픽 버퍼링 본문

IT/C# & WPF

[C# 윈폼] 그래픽 버퍼링

테닝베어 2015. 9. 9. 10:22

윈폼뿐만이 아닌, GUI 프로그래밍을 하다보면 많은 양의 그래픽을 계속 뿌릴때 렉(?)이 걸리는 것을 볼 수 있다.

이는 연산된걸 화면에 뿌리는 작업을 계속 하게 되서 일어나는 일인데, 이를 해결 할 수 있는 방법이 그래픽 버퍼를 이용하는 것이다.


원리는 가상의 그래픽 객체를 만들고, 그 안에서 도형들을 계속 뿌리는 것이다.

다 뿌리고 나서, 그 가상의 그래픽 객체를 우리가 실제로 보는 화면에 한번에 뿌리면 렉(?)이 안걸리는 것을 볼 수 있다.

다음 방법을 따라해 보자.



            BufferedGraphicsContext currentContext;
            BufferedGraphics myBuffer;
 
            currentContext = BufferedGraphicsManager.Current;
            myBuffer = currentContext.Allocate(pn_VoltCircle.CreateGraphics(), pn_VoltCircle.DisplayRectangle);
 
            float centerX, centerY, x, y, R;
            double rad;
 
            centerX = pn_VoltCircle.Width/2;
            centerY = pn_VoltCircle.Height/2;
            R = (pn_VoltCircle.Width/11)*4;
 
            int i = 0;
            Random r = new Random();
 
            for (rad = 0; rad <= * Math.PI; rad += (* Math.PI / 360), i++)  //i가 각도
            {
                x = (float)Math.Round((centerX + R * Math.Cos(rad)), 0);
                y = (float)Math.Round((centerY + R * Math.Sin(rad)), 0);
 
 
 
                SolidBrush pen = new SolidBrush(ct.GetColor(r.Next(0255)));
                myBuffer.Graphics.FillEllipse(pen, x, (centerY * 2- y, 55);
            }
 
            myBuffer.Render();
            myBuffer.Dispose();
cs


※ 밑줄/기울임이 되어있는 텍스트들이 그래픽 버퍼링의 필요 요소들이다.

1. 우선 이중 버퍼링에 사용할 수 있는 그래픽 버퍼를 만드는 메서드를 제공하는 BufferedGraphicsContext를 가져온다.

2. 그래픽 버퍼를 만드는 Allocate를 호출하여 BufferedGraphics 객체를 만든다.(필자는 panel인 pn_VoltCircle이라는 곳에 뿌리기 위해서 저렇게 썼지만, Form에 뿌리고 싶은 사람은 this 라든지, 뿌리고 싶은곳의 객체를 기입하면 된다.)

3. 그래픽 버퍼에 Graphics속성을 이용하여 다양한 그래픽을 그린다.

4. Render()를 이용하여 버퍼와 연결된 그리기 화면에 버퍼를 뿌린다.(만약 다른 화면에 뿌리고 싶다면 myBuffer.Render(뿌릴곳.CreateGraphics())를 이용한다.)

5. 그래픽을 뿌린후 BufferedGraphics를 Dispose시켜서 리소스 해제 시킨다.


참고&출처 : msdn - https://msdn.microsoft.com/ko-kr/library/ka0yazs1(v=VS.110).aspx



Comments