OSG开发笔记(三十五): OsgUtil::Optimizer:优化场景策略,提升显示性能和渲染效率

前言

在OSG中,osgUtil::Optimizer是一个非常重要的工具类,它提供了一系列优化场景图的方法,以提高渲染性能和效率。

Demo


  在笔者的pc上,优化前优化后渲染交互没啥区别,可能是使用的是一个没有分部件的STL大模型原型,内存32GB,以下为cpu和显卡:


  没优化前


  默认优化后,cpu占用率提升,可能是用于优化计算了:


  开启所有优化选项,cpu占用率提升,gpu降低约1%~%2

osgUtil::Optimizer

功能概述

osgUtil::Optimizer是一个强大的优化工具,它提供了多种优化策略,包括几何体合并、节点空间位置分组、相邻LOD节点合并等。以下是几个常用的优化功能:

  • MERGE_GEOMETRY:将多个几何体合并成一个,以减少渲染时的几何体数量,提高渲染效率。这一功能在处理大规模场景时尤为重要,可以显著减少渲染时间。
  • SPATIALIZE_GROUPS:根据节点的空间位置进行分组,便于后续进行裁剪和LOD(Level of Detail)划分。这有助于减少不必要的渲染,提升性能。
  • COMBINE_ADJACENT_LODS:合并相邻的LOD节点,以简化场景图结构,提高渲染效率。
  • 其他优化:osgUtil::Optimizer还提供了许多其他优化功能,如简化几何体、生成法线、生成Delaunay三角网等,以满足不同场景的需求。

使用方法

使用osgUtil::Optimizer进行场景图优化的过程很简单。创建一个osgUtil::Optimizer对象,然后调用其optimize()方法,并传入要优化的场景图节点即可。

使用场景

  • 大规模场景渲染:在处理大规模场景时,osgUtil::Optimizer可以通过合并几何体、优化节点结构等方式,显著提高渲染性能。
  • 实时仿真:在实时仿真应用中,性能是至关重要的。osgUtil::Optimizer可以帮助开发者优化场景图,减少渲染时间,提高仿真效率。
  • 虚拟现实:在虚拟现实应用中,场景复杂度和细节程度通常较高。osgUtil::Optimizer可以通过优化场景图结构,提高渲染效率,从而提升用户体验。
  • 可视化:在可视化应用中,数据通常以三维图形的形式呈现。osgUtil::Optimizer可以帮助开发者优化场景图,提高渲染速度,使数据更加直观地呈现出来。

osg::Optimizer使用步骤

步骤一:添加头文件

cpp 复制代码
#include <osgUtil/Optimizer>

步骤二:创建实例

cpp 复制代码
// 步骤二:创建实例
osgUtil::Optimizer optimizer;

步骤三:优化场景(Node类型下的都可以)

cpp 复制代码
// 步骤三:优化场景
// optimizer.optimize(pGroup.get());
optimizer.optimize(pGroup.get(), osgUtil::Optimizer::ALL_OPTIMIZATIONS); 

Demo源码

cpp 复制代码
osg::ref_ptr<osg::Node> OsgWidget::getOptimizerNode() { // 其他demo的控件 updateControlVisible(false); osg::ref_ptr<osg::Group> pGroup = new osg::Group(); // 加载支持stl格式插件 osgDB::Registry::instance()->addFileExtensionAlias(".stl", "stl"); // 加载模型 { osg::ref_ptr<osg::Node> pNode; QString filePath = "T:/CVN76.STL"; pNode = osgDB::readNodeFile(filePath.toStdString()); if(!pNode.get()) { LOG << "Failed to openFile:" << filePath; } pGroup->addChild(pNode); } #if 1 // 优化场景 { // 步骤一:添加头文件 // #include <osgUtil/Optimizer> // 步骤二:创建实例 osgUtil::Optimizer optimizer; // 步骤三:优化场景 // optimizer.optimize(pGroup.get()); optimizer.optimize(pGroup.get(), osgUtil::Optimizer::ALL_OPTIMIZATIONS); } #endif return pGroup.get(); } 

工程模板v1.38.0