前两天接到一个任务:一个VS2015 + qt5 + osgEarth实现的项目,在向osgEarth场景中添加卫星时,用时过长。
- 首先看一下代码逻辑:
点击"添加"按钮并选择要添加的卫星后(我选择了七百多颗卫星),先将卫星相关参数添加到QTableWidget表格中,接着new出一个卫星节点加入到场景中。 - 定位问题
使用clock()函数算出了时间为87s左右,这太久了。于是继续细看代码并使用clock()函数辅助定位具体耗时的位置,最终发现两个一下两个问题:
1)添加卫星时是一个一个添加的,每添加一个都要向QTableWidget中插入一行,代码如下:
每插入一行,表格就会重新刷新一次,所以会耗费很多时间。int lastRow = tableWidget->rowCount(); tableWidget->insertRow(lastRow);
2)在new出卫星节点的过程当中,会进行两次读文件操作(一次是读取卫星表面贴图,一次是读取卫星显示名字的字体),而磁盘操作比较费时。 - 解决问题
定位到问题就好解决了,以下是我使用的方式:
1)第一个问题只需要在最开始算出来表格总共是多少行,使用函数setRowCount()事先设置好行数,就不需要每次都插入一行。
2)第二个问题,先将文件中的数据读到缓存中(使用变量存储到内存中),当需要的时候直接从缓存中读取。
经过上面的操作,再运行,只花费了一秒多,哈哈哈哈完美!!