程序员来看看这段代码怎么优化

u014522321 2014-07-06 09:49:09
for ( int i =0; i < num; i++ )//num读取的配置文件个数,现在5个文件,程序显示出来差不多5s了,将来100多了要死了
{
CStdioFile cSf;
wstring m_CurPath = TempPath + _T( "data\\raderinfo\\resultfile\\" ) + m_StrCity[i];
CPoint* PointList = new CPoint[MAX_SIZE];//保存从配置文件读取的数据转化后的坐标,在地图上填充使用
if ( cSf.Open( (LPCTSTR)m_CurPath.c_str(), CStdioFile ::modeRead ) )
{
ResultArray JWArray;//向量保存配置文件数据的坐标
while ( cSf.ReadString( JWStr ) )
{
CString LineTemp = JWStr.Trim();
CTools::StringSplit (LineTemp.GetBuffer(), " ", JWArray );//自定义函数
}
dJd = CTools::StringToLo( JWArray[0] );//自定义函数
dWd = CTools::StringToLa( JWArray[1] );//自定义函数
MapInfo->JwToXy( dJd, dWd, &dX, &dY );//自定义函数
MapInfo->xyLToD( (float)dX, (float)dY, &nDx, &nDy );//自定义函数
pDC->MoveTo( nDx, nDy );//移动到第一个坐标点
int i = 0;//记录PointList个数,填充图形
for ( ResultArray::iterator it = JWArray.begin(); it != JWArray.end(); it++, i++)//绘制多边形
{
dJd = CTools::StringToLo( *it++ );
dWd = CTools::StringToLa( *it );
MapInfo->JwToXy( dJd, dWd, &dX, &dY );
MapInfo->xyLToD( (float)dX, (float)dY, &nDx, &nDy );
pDC->LineTo( nDx, nDy );
PointList[i].x = nDx;
PointList[i].y = nDy;
}
CRgn rgn;
CBrush brush( RGB( 100, 10, 255 ));
if ( rgn.CreatePolygonRgn( PointList, i, ALTERNATE))
{
pDC->fillRgn( &rgn, &brush );//填充绘制的多边形
}
}
delete[] PointList;
}
主要优化程序的执行效率,该怎么优化? 一个配置文件大概5W个坐标点,还有我可不可以吧绘制的图形的坐标点记录起来,应为以后还有多次用到绘制的图像,大家有没有多边形相交的算法?
...全文
493 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
灌水号 2014-07-11
  • 打赏
  • 举报
回复
5W多个你一行一行的读当然慢,如果不能一次性读进来,那分几次好了.
u014522321 2014-07-10
  • 打赏
  • 举报
回复
多重循环用什么可以代替吗
u014522321 2014-07-10
  • 打赏
  • 举报
回复
引用 4 楼 songhtao 的回复:
应该是图形绘制慢,先在内存绘制,然后再显示。
多边形相交的有什么好算法吗?我做的是地图,要把雷达站的信息叠加到地图上去,要分九重叠加,好晕啊
u014522321 2014-07-10
  • 打赏
  • 举报
回复
引用 3 楼 PPower 的回复:
将读取与绘制这两个过程分开。 先读入内存,然后再绘制,这样可以可以直观地统计读取花多时间,绘制花多少时间。就可以将优化的精力放在耗时长的项目上。 如果是读入耗时太长,5W个坐标点 检查Array:ResultArray JWArray;//是否多次重分配内存,最好是一次预分配足够的内存 如果是绘图耗时太长,则考虑绘图过程是否合理并足够快。这里我估计是绘图过程慢,可考虑图形缓冲,或者其他更快的图形绘制技术。
我试过了是读取配置的时间太长,绘图基本不耗时间,我读配置在OnDraw函数里读的,每次放大缩小移动都要重绘,好麻烦啊,我是做的DLL,不知道该在哪里读取配置文件?还有我用ConbineRgn求出来的多边形能用什么方法求出边界坐标吗?
我不懂电脑 2014-07-07
  • 打赏
  • 举报
回复
应该是图形绘制慢,先在内存绘制,然后再显示。
勉励前行 2014-07-07
  • 打赏
  • 举报
回复
将读取与绘制这两个过程分开。 先读入内存,然后再绘制,这样可以可以直观地统计读取花多时间,绘制花多少时间。就可以将优化的精力放在耗时长的项目上。 如果是读入耗时太长,5W个坐标点 检查Array:ResultArray JWArray;//是否多次重分配内存,最好是一次预分配足够的内存 如果是绘图耗时太长,则考虑绘图过程是否合理并足够快。这里我估计是绘图过程慢,可考虑图形缓冲,或者其他更快的图形绘制技术。
dataxdata 2014-07-06
  • 打赏
  • 举报
回复
1 这句 CPoint* PointList = new CPoint[MAX_SIZE]; 可以移到循环的外面 2 读文件时候,除非文件特别大,最好一次性读入内存,然后在内存中去解析文件,特别是对于有很多行、每行又很短的文本文件,可以提高很多处理速度 3多边形相交可以转换成线段相交的问题,可以用叉乘来进行判断
u014522321 2014-07-06
  • 打赏
  • 举报
回复
CPoint* PointList = new CPoint[MAX_SIZE];这句我在外边也试过,好像不行,明天去了再试试。线段相交?

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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