안녕하세요
델마당 강좌,팁 정보 게시판에 조무영님께서 올려놓으신 "[팁] 색상 선택하기" 샘플코드를
c++ Builder 바꿔보았습니다.
http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?mode=vote&num=4718&db=dmdlec3&backdepth=2
그런데
색상파렛트를 만드는 함수를
delphi와 거의 똑같이 만들었다고 생각되는데
GetTickCout로 시간을 계산해보면
Delphi가 두배이상 빠릅니다.
왜그런것이지 모르겟네요
[조무영님의 delphi코드]
procedure TMain.ColImageUpdate(MainCol: TColor);
type
PDWORDArray = PIntegerArray;
var
iX, iY, XMax, YMax: Integer;
R, G, B, MainR, MainG, MainB: Byte;
XBoganValue, YBoganValue: Single;
P: PDWORDArray;
iTic1,iTic2: Integer;
begin
iTic1 := GetTickCount;
with ColImg do
begin
XMax:=Width;
YMax:=Height;
if Picture.Bitmap.Width <XMax then Picture.Bitmap.Width :=XMax;
if Picture.Bitmap.Height<YMax then Picture.Bitmap.Height:=YMax;
MainB:= MainCol and $FF;
MainG:=(MainCol shr 8) and $FF;
MainR:=(MainCol shr 16) and $FF;
for iY:=0 to YMax-1 do
begin
P:=Picture.Bitmap.ScanLine[iY];
for iX:=0 to XMax-1 do
begin
XBoganValue:=iX/XMax;
YBoganValue:=iY/YMax;
R:=Trunc(((MainR*XBoganValue)+($FF*(1-XBoganValue)))*(1-YBoganValue));
G:=Trunc(((MainG*XBoganValue)+($FF*(1-XBoganValue)))*(1-YBoganValue));
B:=Trunc(((MainB*XBoganValue)+($FF*(1-XBoganValue)))*(1-YBoganValue));
//Canvas.Pixels[iX, iY]:=RGB(R, G, B); // 이건 느려서 못써요
P[iX]:=(B shl 16) or (G shl 8) or R;
end;
end;
iTic2 := GetTickCount;
Label2.Caption := IntToStr(iTic2-iTic1);
Repaint;
end;
end;
[C++ Builder 변환 코드]
//--------------------------------------------------------------------------
void __fastcall TMain::ColImageUpdate(TColor MainCol )
{
int iX, iY, XMax, YMax;
unsigned char R, G, B, MainR, MainG, MainB;
float XBoganValue, YBoganValue;
// RGBTRIPLE *pt;
int *pt;
int iTic1,iTic2;
iTic1=GetTickCount();
XMax=ColImg->Width;
YMax=ColImg->Height;
if ( ColImg->Picture->Bitmap->Width <XMax ) ColImg->Picture->Bitmap->Width =XMax;
if ( ColImg->Picture->Bitmap->Height<YMax ) ColImg->Picture->Bitmap->Height=YMax;
MainB= MainCol & 0xFF;
MainG=(MainCol >> 8) & 0xFF;
MainR=(MainCol >> 16) & 0xFF;
for( iY=0 ; iY<YMax ;iY++)
{
pt=(int *)ColImg->Picture->Bitmap->ScanLine[iY];
for( iX=0 ; iX< XMax;iX++)
{
XBoganValue=iX/(XMax*1.0);
YBoganValue=iY/(YMax*1.0);
R=((MainR*XBoganValue)+(0xFF*(1-XBoganValue)))*(1-YBoganValue);
G=((MainG*XBoganValue)+(0xFF*(1-XBoganValue)))*(1-YBoganValue);
B=((MainB*XBoganValue)+(0xFF*(1-XBoganValue)))*(1-YBoganValue);
//ColImg->Canvas->Pixels[iX][iY]=RGB(R, G, B); // 이건 느려서 못써요
//ColImg->Canvas->Pixels[iX][iY]=((B << 16) | (G << 8) | R); // 이것도 느림
pt[iX]=((B << 16) | (G << 8) | R); //1)
// pt[iX]=RGB(R, G, B); //2) 속도 빠름 - 1)번과 비슷함
//결론::RGB()함수가 느린것이 아니라 ColImg->Canvas->Pixels[][] 함수가 느린것임
// 그런데 이상하다 그렇게 해도 delphi보다 속도가 느린다 왜 그런것일까?
}
}
iTic2=GetTickCount();
Label2->Caption=IntToStr(iTic2-iTic1);
ColImg->Repaint();
}
//-