c# GDI+ 꺼져!! BufferedGraphics
요즘세상에서 c#의 gdi가 c++의 gdi 보다 느리다라고 하는 사람들이 있습니다...
뭐 느릴수도 있겠죠...
근데 너무 우기는건 좀 아닌거 아닌가욤(먼소리지)
저는 mfc도 개발하고 c#도 개발하고..
사실 더 그래픽컬하고 gdi를 많이 쓰는건 c# 개발할때 였습니다...
처음에 c#으로 개발할때 paint 는 정말 못쓸정도였(!?)지만 방법이 없는건 아니었죠..
결국 사람들이 방법을 모르는거지 누가빠르고 누가 느리다라고 승질낼일은 아닌거 같네요..
글 옮기다가 갑자기 생각나서 몇자 추가해봅니다..
C# 에서 더블 버퍼링은 정말 간단하게 설정이 됩니다.
그것이 폼이든 판넬이든 말이죠.
요 3줄이면 설정이 끝나죠( 저같은 경우는 form이나 panel, pictureBox를 상속받는 더블버퍼용 컨트롤을 새로 만들어서 사용합니다.)
그러나!
더블버퍼링을 위한( 꼭 위한은 아닙니다. 더블버퍼링을 사용하지 않더라도 ) GDI+ 의 성능 개선을 위한
graphics 객체가 있었으니 그 이름하여 BufferedGraphics !!!
보통 Paint 함수에서
Graphics g = e.Graphics ;
이런식으로 Graphic 객체를 생성하여서 사용하는데요...
BufferedGraphics는 약간 다릅니다.
Paint 부분 소스입니다.
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 하는 방식입니다.
현재 저 같은 경우는 엄청난 양의 그래픽을 그리고 있는데요(정말 엄청난... -_-)
확실히 그리는 속도와 갱신속도의 차이가 나는군요!!
이 방법은 무조건 쓰게 될듯합니다 ㅎㅎㅎ
뭐 느릴수도 있겠죠...
근데 너무 우기는건 좀 아닌거 아닌가욤(먼소리지)
저는 mfc도 개발하고 c#도 개발하고..
사실 더 그래픽컬하고 gdi를 많이 쓰는건 c# 개발할때 였습니다...
처음에 c#으로 개발할때 paint 는 정말 못쓸정도였(!?)지만 방법이 없는건 아니었죠..
결국 사람들이 방법을 모르는거지 누가빠르고 누가 느리다라고 승질낼일은 아닌거 같네요..
글 옮기다가 갑자기 생각나서 몇자 추가해봅니다..
C# 에서 더블 버퍼링은 정말 간단하게 설정이 됩니다.
그것이 폼이든 판넬이든 말이죠.
this.SetStyle(ControlStyles.DoubleBuffer,
true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, 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;
}
{
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 하는 방식입니다.
현재 저 같은 경우는 엄청난 양의 그래픽을 그리고 있는데요(정말 엄청난... -_-)
확실히 그리는 속도와 갱신속도의 차이가 나는군요!!
이 방법은 무조건 쓰게 될듯합니다 ㅎㅎㅎ
훌륭한 내용 잘일었습니다.^^
답글삭제와... 이렇게 할 수 있군요 잘 배우고 갑니다~!
답글삭제