前言
在OSG中,osgUtil::Optimizer是一個非常重要的工具類,它提供了一系列最佳化場景圖的方法,以提高渲染效能和效率。
在筆者的pc上,最佳化前最佳化後渲染互動沒啥區別,可能是使用的是一個沒有分部件的STL大模型原型,記憶體32GB,以下為cpu和顯示卡:
沒最佳化前
預設最佳化後,cpu佔用率提升,可能是用於最佳化計算了:
開啟所有最佳化選項,cpu佔用率提升,gpu降低約1%~%2
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可以幫助開發者最佳化場景圖,提高渲染速度,使資料更加直觀地呈現出來。
#include <osgUtil/Optimizer>
// 步驟二:建立例項
osgUtil::Optimizer optimizer;
// 步驟三:最佳化場景
// optimizer.optimize(pGroup.get());
optimizer.optimize(pGroup.get(), osgUtil::Optimizer::ALL_OPTIMIZATIONS);
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();
}