关于gdi+和效率的问题,困扰了我好一阵子了!

lgdgyd2 2008-03-26 11:59:58
写了一个函数,是用gdi+来划线,但是由于数据比较多,划线效率可以说是慢到了无法忍受!请大侠们帮帮偶,看看这段程序到底是什么地方影响了程序的执行效率!代码如下:

DrawBoneStroke(HDC pdc,Graphics* graphic,Pen* smoothpen,Point* src, int npoints,COLORREF color,double* prePw)
{
if (npoints<7)
return;
double distance;
double delx,dely;
double pw;
double constant;
double averageDis = 0;
BOOL bDiginoteStroke = FALSE;



smoothpen->SetColor(Color(75,GetRValue(color),GetGValue(color),GetBValue(color)));

for (int i=0;i<npoints-1;i++)
{
delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);
averageDis += distance;
}
if (averageDis<15)
return;
averageDis /= (npoints-1);
//averageDis = 2.00;


if (PenWidth != 1)
constant = 20;
else
{
constant = averageDis;
bDiginoteStroke = TRUE;
}

for (int i=0;i<npoints-1;i++)
{

//只画前3个点和后三个//////////////////////
if((i>3 && i<npoints-3) && bDiginoteStroke == TRUE)
{
continue;
}
////////end of 只画前3个点//////

delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);

if (distance == 0)
pw = 1;
else
pw = constant/distance;

if (PenWidth == 1)
{
if (pw<1)
{
pw =1;
}
if (pw > PenWidth)
{
pw = PenWidth+1;
}
}
else
{
if (pw<2)
{
pw = 2;
}
if (pw>PenWidth)
{
pw = PenWidth;
}
}


if (i==0)
{
smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);
(*prePw) = pw;
continue;
}


if ((pw-(*prePw))>0.5)
pw = (*prePw) + 0.5;
else if (((*prePw)-pw)>0.5)
pw = (*prePw) - 0.5;
else
pw = (*prePw);

smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);

(*prePw) = pw;

}
...全文
178 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgdgyd2 2008-03-27
  • 打赏
  • 举报
回复
npoints一般都是30-50,不过外面的笔划数很大,能有几百个笔划!我发现其实程序主要是消耗在最后一个DrawLine语句上了,将这句代码注掉,运行的速度就可以了,那句话是整个函数的关键,没了那句话,函数的存在就没意义了!
「已注销」 2008-03-26
  • 打赏
  • 举报
回复
没看清楚代码是什么意思,
但是你的函数中比较多的开方和除法,而且在循环里,这个比较影响效率
GDI+本身应该不存在什么效率问题,慢都是慢在自己编写的过程里
lgdgyd2 2008-03-26
  • 打赏
  • 举报
回复
靠,贴的什么东西?
代码错了,重新来
DrawBoneStroke(HDC pdc,Graphics* graphic,Pen* smoothpen,Point* src, int npoints,COLORREF color,double* prePw)
{
if (npoints<7)
return;
double distance;
double delx,dely;
double pw;
double constant;
double averageDis = 0;
BOOL bDiginoteStroke = FALSE;



smoothpen->SetColor(Color(75,GetRValue(color),GetGValue(color),GetBValue(color)));

for (int i=0;i<npoints-1;i++)
{
delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);
averageDis += distance;
}
if (averageDis<15)
return;
averageDis /= (npoints-1);
//averageDis = 2.00;


if (PenWidth != 1)
constant = 20;
else
{
constant = averageDis;
bDiginoteStroke = TRUE;
}

for (int i=0;i<npoints-1;i++)
{

//只画前3个点和后三个//////////////////////
if((i>3 && i<npoints-3) && bDiginoteStroke == TRUE)
{
continue;
}
////////end of 只画前3个点//////

delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);

if (distance == 0)
pw = 1;
else
pw = constant/distance;

if (PenWidth == 1)
{
if (pw<1)
{
pw =1;
}
if (pw > PenWidth)
{
pw = PenWidth+1;
}
}
else
{
if (pw<2)
{
pw = 2;
}
if (pw>PenWidth)
{
pw = PenWidth;
}
}


if (i==0)
{
smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);
(*prePw) = pw;
continue;
}


if ((pw-(*prePw))>0.5)
pw = (*prePw) + 0.5;
else if (((*prePw)-pw)>0.5)
pw = (*prePw) - 0.5;
else
pw = (*prePw);

smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);

(*prePw) = pw;

}
明天去抢劫 2008-03-26
  • 打赏
  • 举报
回复
npoints值一般有多大?
lgdgyd2 2008-03-26
  • 打赏
  • 举报
回复
由于程序需要特殊的划线效果,考虑到在xp和vista上的都能正常运行,所以改用调用gdi+函数的!
V若只如初见 2008-03-26
  • 打赏
  • 举报
回复
考虑把大量的计算都在外面做完,而draw的时候,最好就直接调用GDI的方法,这样效率就上来了
明天去抢劫 2008-03-26
  • 打赏
  • 举报
回复
发错了,重发

DrawBoneStroke(HDC pdc,Graphics* graphic,Pen* smoothpen,Point* src, int npoints,COLORREF color,double* prePw)
{
if (npoints <7)
return;

double distance;
double delx,dely;
double pw;
double constant;
double averageDis = 0;
BOOL bDiginoteStroke = FALSE;

smoothpen->SetColor(Color(75,GetRValue(color),GetGValue(color),GetBValue(color)));

for (int i=0;i <npoints-1;i++)
{
delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);
averageDis += distance;
}
if (averageDis <15)
return;

averageDis /= (npoints-1);
//averageDis = 2.00;

if (PenWidth != 1)
constant = 20;
else
{
constant = averageDis;
bDiginoteStroke = TRUE;
}

for (int i = 0;i < npoints - 1;i++)
{

//只画前3个点和后三个//////////////////////
if((i>2 && bDiginoteStroke == TRUE)
{
i = npoints - 5; //因为i还要加一次 也就是说到一次循环i的值为npoints - 4
//因为基点是0所以,要减4而不是减3,点多的话,时间可能被你这个循环浪费了
}
////////end of 只画前3个点//////

delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);

if (distance == 0)
pw = 1;
else
pw = constant/distance;

if (PenWidth == 1)
{
if (pw <1)
{
pw =1;
}
if (pw > PenWidth)
{
pw = PenWidth+1;
}
}
else
{
if (pw <2)
{
pw = 2;
}
if (pw>PenWidth)
{
pw = PenWidth;
}
}


if (i==0)
{
smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);
(*prePw) = pw;
continue;
}


if ((pw-(*prePw))>0.5)
pw = (*prePw) + 0.5;
else if (((*prePw)-pw)>0.5)
pw = (*prePw) - 0.5;
else
pw = (*prePw);

smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);

(*prePw) = pw;

}
明天去抢劫 2008-03-26
  • 打赏
  • 举报
回复

DrawBoneStroke(HDC pdc,Graphics* graphic,Pen* smoothpen,Point* src, int npoints,COLORREF color,double* prePw)
{
if (npoints <7)
return;
double distance;
double delx,dely;
double pw;
double constant;
double averageDis = 0;
BOOL bDiginoteStroke = FALSE;



smoothpen->SetColor(Color(75,GetRValue(color),GetGValue(color),GetBValue(color)));

for (int i=0;i <npoints-1;i++)
{
delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);
averageDis += distance;
}
if (averageDis <15)
return;
averageDis /= (npoints-1);
//averageDis = 2.00;


if (PenWidth != 1)
constant = 20;
else
{
constant = averageDis;
bDiginoteStroke = TRUE;
}

for (int i=0;i <npoints-1;i++)
{

//只画前3个点和后三个//////////////////////
if((i>3 && i <npoints-3) && bDiginoteStroke == TRUE)
{
continue;
}
////////end of 只画前3个点//////

delx = src[i].X - src[i+1].X;
dely = src[i].Y - src[i+1].Y;
distance = sqrt((double)delx*delx + dely*dely);

if (distance == 0)
pw = 1;
else
pw = constant/distance;

if (PenWidth == 1)
{
if (pw <1)
{
pw =1;
}
if (pw > PenWidth)
{
pw = PenWidth+1;
}
}
else
{
if (pw <2)
{
pw = 2;
}
if (pw>PenWidth)
{
pw = PenWidth;
}
}


if (i==0)
{
smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);
(*prePw) = pw;
continue;
}


if ((pw-(*prePw))>0.5)
pw = (*prePw) + 0.5;
else if (((*prePw)-pw)>0.5)
pw = (*prePw) - 0.5;
else
pw = (*prePw);

smoothpen->SetWidth(pw);
graphic->DrawLine(smoothpen,src[i],src[i+1]);

(*prePw) = pw;

}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧