好久没更新,随便写几个分享。
在最近软件开发过程中,总结了几个技术技巧,记录一下:
(1)正射影像生成及内存管理问题
(2)网络硬盘数据读写传输问题
(3)gdal Dataset 释放注意
一、正射影像生成及内存管理问题
使用OSG,离屏渲染生成正射影像。
首先,要提前准备好分辨率、影像大小、相机视角等信息,具体的,参考 OpenSceneGraph 里 osgautocapture.cpp 相关代码。
但 osgautocapture.cpp 是exe代码,每次只能执行一遍,且输出的图像大小固定。
如果存在这样一个需求:生成若干张分辨率相同,但图像大小不同的影像,那么,使用 osgautocapture.cpp 里的代码将很不方便。
一种方法是使用命令行,每次传递不同的参数,反复调用 exe 进行生成,但该方法效率很低,当生成的影像很多时,整个软件效率将会迅速降低。同时,以命令行调用 exe 存在不可控、不稳定的问题,如果出现错误,排查起来存在困难,提升维护成本。
那么,如果循环使用 osgautocapture.cpp 里的代码,那么,每次生成新的正射影像,因为需要重新配置参数,需要反复使用以下语句:
osg::ref_ptr<osg::GraphicsContext> pbuffer = osg::GraphicsContext::createGraphicsContext(traits.get());
那么后果就是在内存中创建不可删除的对象,最后导致内存占用迅速上升,最后导致OOM错误,或者被杀毒软件、操作系统认为是病毒而杀死。
那么,pbuffer是个什么东西呢?从代码可知,它是一个图形上下文对象,根据 traits 的配置而创建,而 traits 定义如下:
osg::DisplaySettings* ds