OSG開發筆記(三十五): OsgUtil::Optimizer:最佳化場景策略,提升顯示效能和渲染效率

长沙红胖子Qt创微智科發表於2024-11-28

前言

  在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使用步驟

步驟一:新增標頭檔案

  在這裡插入圖片描述

#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

  在這裡插入圖片描述

相關文章