GDI+ 객체로 그리기할 때 화면 깜박임 줄이기 - 더블 버퍼링
안녕하세요 : )
뭐라고 할 말이 없을만큼 오래간만입니다 ;;;
이제 프로젝트도 거의 종료가 되어가고, 개인적으로 준비하던 일도 어찌어찌 끝이 보이기 시작하는데다가, '아 그럼 예전에 그만뒀던 연재를 시작해볼까!'라고 열의를 불태워볼까 했더니!
...6사단으로 소집명령이 떨어졌습니다 orz
아직 시간은 좀 있습니다만, 뭔가 멍해져 버려서.. 짧은 아티클이라도 올리고 끌려가자는 마음에 끄적여 봅니다 ;
그리고 그려 그리고픈
어떤 언어를 배웠든 간에, 화면에 연속적으로 뭔가를 그려보려는 시도해 봤던 사람은 '어라 이거 왜 화면이 깜박거리냐..'라는 생각을 한 번쯤은 해 봤을 것이다. 이 아티클은 그런 현상을 해결하는 방법을 설명한다.
.Net에서는 GDI+라는 인터페이스를 제공, 그래픽과 관련된 장치를 제어하도록 하고 있다. 보통 이와 관련된 클래스와 기타 객체들은 System.Drawing 네임스페이스를 통해서 제공된다.
준비가 되었다면, 윈폼 기반의 프로젝트를 하나 생성하고 버튼 두 개를 추가한 뒤 다음과 같은 소스를 입력하여 보자 :
private void button1_Click(object sender, System.EventArgs e)
{
Graphics graphic = this.CreateGraphics();
SolidBrush brush = new SolidBrush(Color.DarkRed);
for(int i=0;i<200;i++)
{
graphic.Clear(this.BackColor);
graphic.FillEllipse(brush, i, 0, 200, 200);
}
brush.Dispose();
graphic.Dispose();
}
private void button2_Click(object sender, System.EventArgs e)
{
Graphics graphic = this.CreateGraphics();
SolidBrush brush = new SolidBrush(Color.DarkRed);
Bitmap bitmap = new Bitmap(
this.Width, this.Height
);
Graphics memGraphic = Graphics.FromImage(bitmap);
for(int i=0;i<200;i++)
{
memGraphic.Clear(this.BackColor);
memGraphic.FillEllipse(brush, i, 0, 200, 200);
graphic.DrawImageUnscaled(bitmap,0,0);
}
brush.Dispose();
memGraphic.Dispose();
bitmap.Dispose();
graphic.Dispose();
}
둘 다 적색의 원을 오른쪽으로 이동시키며 그리는 코드이지만 버튼 1은 더블 버퍼링을 사용하지 않은 것이고, 버튼 2는 더블 버퍼링을 사용한 코드이다. 코드를 보면 알겠지만, 비트맵으로부터 얻은 Graphics 객체에 그리기와 관련된 모든 작업을 한 후에 비트맵을 폼의 Graphics 객체에 그리는 부분이 추가되어 있다. 이 경우 실제 폼에 대한 그리기 작업은 한 번만 이루어지기 때문에 깜박임이 없어지게 된다.
설명을 보기보다는 실행시켜보면 이 기법을 써야할 이유를 알게 될 것이다 : )
p.s:Dispose() 메서드는 사실 안 써도 별 상관 없지만, GC가 리소스를 빨리 해제해도록 하는데 도움이 되므로 쓰는 습관을 들이는 게 좋다.
정리
간단하지만 남들이 잘 알려주지 않는 코드였습니다.
그럼 : )
출처 : http://www.gosu.net/GosuWeb/Article-detail.aspx?ArticleCode=955
'Programming > C#' 카테고리의 다른 글
C# 주의해야 할 문법(dispose,using,close) (2) | 2010.06.28 |
---|---|
Handling Application Events: On Idle (0) | 2010.06.28 |
키보드상태 얻기(Ins ' Num Lock' Caps Lock) (0) | 2010.06.25 |
C#에서 실행 경로(또는 현재 경로)를 알아내는 방법 (1) | 2010.06.10 |
각종 윈도우 영역 크기 얻기... (0) | 2010.06.03 |