블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

안녕하세요 : )

뭐라고 할 말이 없을만큼 오래간만입니다 ;;;

 

이제 프로젝트도 거의 종료가 되어가고, 개인적으로 준비하던 일도 어찌어찌 끝이 보이기 시작하는데다가, '아 그럼 예전에 그만뒀던 연재를 시작해볼까!'라고 열의를 불태워볼까 했더니!

 

...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

반응형
Posted by blueasa
, |