- 整体懒加载逻辑
在这个代码示例中,懒加载的核心思想是只有当真正需要显示某张影像(通过 loadImageData 函数根据索引请求加载影像数据)时,才会从磁盘读取该影像对应的 TIFF 文件并将其数据加载到内存中转换为 QImage 进行显示。影像的元数据(如文件路径、尺寸等)在程序启动时通过 loadImageIndex 函数提前扫描并收集存储起来,方便后续快速判断和定位要加载的影像。 - 缓存机制与 LRU 策略结合
为了避免频繁从磁盘读取影像数据,提高加载效率,代码中引入了缓存机制,使用 std::unordered_map 来存储已经加载过的影像数据(以影像索引为键,对应的 QImage 为值)。同时,采用最近最少使用(LRU)策略来管理缓存大小,避免缓存无限制增长导致内存占用过高。
updateCacheAccessOrder 函数用于在每次访问缓存中的影像数据时(也就是调用 loadImageData 函数发现影像已在缓存中时),将该影像的索引移动到缓存访问顺序列表 cacheAccessOrder 的头部,表示它是最近刚被使用过的,这样列表尾部的元素就是最久未被使用的影像索引。
checkAndEvictCache 函数则会定期检查缓存中影像数据的数量是否超过了设定的最大缓存大小 maxCacheSize,如果超过了,就从缓存访问顺序列表的尾部获取最久未被使用的影像索引,然后调用 releaseImageData 函数释放该影像占用的内存,并从缓存中移除对应的记录,以此实现 LRU 淘汰机制,确保缓存中的数据始终是相对较新且经常被访问的,优化内存利用效率。 - 加载影像数据流程中的懒加载体现
在 loadImageData 函数中,首先会检查请求加载的影像索引对应的影像数据是否已经存在于缓存中,如果已经在缓存里了,就直接返回缓存中的数据,并更新其在缓存访问顺序列表中的位置(通过 updateCacheAccessOrder 函数)。只有当影像数据不在缓存时,才会使用 GDAL 库打开对应的 TIFF 文件(通过 GDALOpen 函数),读取其影像数据,根据数据类型转换为合适的 QImage 格式,成功加载后存入缓存,同时再次更新缓存访问顺序列表以及检查执行缓存淘汰操作(通过 checkAndEvictCache 函数),最后返回加载好的影像数据。
通过这样的懒加载策略与缓存管理机制相结合的方式,在使用 GDAL 库处理大量 TIFF 影像数据时,能够在保障可以按需加载影像进行显示的同时,有效控制内存的使用量,提升整个影像显示框架在面对上千张影像场景下的性能和稳定性。当然,实际应用中还可以根据具体需求进一步优化,比如更精细的缓存管理、错误处理优化以及与 Qt 显示界面更紧密的交互集成等。
使用示例(在主窗口类等相关场景中)
以下是一个简单的在 Qt 主窗口类中使用 ImageDataManager 类来管理和显示影像的示例示意,展示如何结合前面的数据管理类来实现基本的影像显示逻辑(这里只是简单示意,实际需完善界面布局、交互等更多功能)。
cpp
#include <QMainWindow>
#include <QGraphicsScene>
#