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

前言

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

 

Demo

  测试的一个模型:
  在这里插入图片描述
  

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

  这是默认优化,cpu是原来的80%左右,gpu差不多
  在这里插入图片描述

  这是优化后的,cpu是原来的35%左右,gpu差不多
  在这里插入图片描述
  测试的另一个模型数据:
  没优化前
  在这里插入图片描述

  默认优化后,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使用步骤

步骤一:添加头文件

  在这里插入图片描述

#include <osgUtil/Optimizer>

步骤二:创建实例

  在这里插入图片描述

// 步骤二:创建实例
osgUtil::Optimizer optimizer;

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

  在这里插入图片描述

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

Demo源码

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

  在这里插入图片描述

posted @ 2024-11-28 09:44  长沙红胖子Qt创微智科  阅读(159)  评论(0编辑  收藏  举报