|
关于使用osgearth的addelevationlayer和addimagelayer方法来动态、实时加载大量地形及配套纹理数据时出现了问题。
我写了一个线程,每隔10s左右检测一下指定目录,如果发现新的地形和纹理数据,就用以上方法加载进map,地形和纹理数据都是tif格式,具体线程中的代码如下:
virtual void run()
{
_done = false;
_dirty = true;
do
{
YieldCurrentThread();
addNewTerrainModel();
OpenThreads::Thread::microSleep(10000000);
} while( !_done );
}
void addNewTerrainModel( )
{
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_mutex);
ostringstream ostrfile,ostrname;
ostrname<<fileformat<<index;
string strDEMFile, strImgFile;
ostrfile<<strDataDir<<"\\"<<fileformat<<index<<".tif";
BOOL bExist = PathFileExists(ostrfile.str().c_str());
if(bExist)
strDEMFile = ostrfile.str();
else
return;
ostrfile.str("");
ostrfile<<strDataDir<<"\\"<<fileformat<<index<<".tif";
bExist = PathFileExists(ostrfile.str().c_str());
if(bExist)
strImgFile = ostrfile.str();
else
return;
GDALOptions gdal;
gdal.url() = strDEMFile;
ElevationLayerOptions elevLayOpt(ostrname.str(), gdal);
map->addElevationLayer(new ElevationLayer(elevLayOpt));
gdal.url() = strImgFile;
ImageLayerOptions imgLayOpt(ostrname.str(), gdal);
map->addImageLayer(new ImageLayer(imgLayOpt));
index++;
_dirty = true;
}
但是这么做有一个缺点,就是随着数据逐步加入,程序内存占用相当厉害,最后程序就崩溃了。
我考虑给map加个缓存以提高效率,因此,我在主线程中创建map钱加入了如下代码:
TMSCacheOptions tmsopt;
tmsopt.setPath(strCacheDir);
MapOptions mapopt;
mapopt.cache() = tmsopt;
mapopt.cache()->cacheOnly() = false;
map = new osgEarth::Map(mapopt);
可是效果也不是太理想,而且,如果程序第二次运行,缓存目录中有上次缓存的文件夹,程序会直接崩溃。
有哪位研究过osgearth的请帮忙分析一下原因,或给点提示。谢谢! |
|