若该文为原创文章,未经允许不得转载
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/144092964
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…
OSG开发专栏(点击传送门)
上一篇:《OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率》
下一篇: 持续补充中…
前言
在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
上一篇:《OSG开发笔记(三十四): OsgUtil::Simplifier:简化几何体,提升显示性能和渲染效率》
下一篇: 持续补充中…
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/144092964