3만개를 찍는데 그렇게 느린가요?
다음과 같이 20만개의 점을 SetPixel을 찍어도 500ms가 나오지 않던데...
void __fastcall TForm1::Button9Click(TObject *Sender)
{
//
int tic=GetTickCount();
HDC dc=GetDC(this->Handle);
for(int i=0;i<200000;i++)
{
int x=rand()%this->ClientWidth;
int y=rand()%this->ClientHeight;
SetPixel(dc,x,y,clRed);
}
ReleaseDC(Handle,dc);
tic=GetTickCount()-tic;
ShowMessage(tic);
//제 노트북에서 약 400ms
}
//---------------------------------------------------------------------------
그리고 님의
코드에 문제가 하나 있습니다.
GetDC를 했으면 반드시 ReleaseDC를 해줘야 합니다.
//다음과 같이 GetDC , ReleaseDC를 반복할 경우 약 1300ms
void __fastcall TForm1::Button10Click(TObject *Sender)
{
int tic=GetTickCount();
for(int i=0;i<200000;i++)
{
int x=rand()%this->ClientWidth;
int y=rand()%this->ClientHeight;
HDC dc=GetDC(this->Handle);
SetPixel(dc,x,y,clRed);
ReleaseDC(Handle,dc);
}
tic=GetTickCount()-tic;
ShowMessage(tic);
}
//---------------------------------------------------------------------------
즉 GetDC를 한번으로 줄이기만 해도 속도가 3배이상 나올것 같습니다.
그리고 원래 SetPixel 은 느린걸로 알고있습니다.
더블버퍼링을 써야 빨라집니다.
더블버퍼링이란?
1. 먼저 memoryDC에다가 원하는 그림을 다 그리고
2. 맨 그림을 다 그린후에 실제 dc에다가 한번에 paint하는 방식입니다.
그럼..
정연진 님이 쓰신 글 :
: 안녕하세요..초보 빌더 6.0입니다..^^;
: 제가 파일에서 좌표값을 받아서 화면에 점을 찍는데요..
: 너무 느리네요. 한줄 읽어서 점찍고 한줄 읽어서 점찍고 하는거 같네요..
: 한 3만개쯤 되는데 버벅 거리다 끝나버려요....
:
: while(fgets(lines,100,fp))
: {
: sscanf(lines,"%d,%d",&x,&y);
: SetPixel(GetDC(this->Handle),x,y,clWhite);
: }
: 이런식으로 했는데요..
:
: 어떤 다른 좋은 방법이 있을지 고수님들 도와주세요^^;