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使用步骤
步骤一:添加头文件

#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::Optimizer:优化场景策略,提升显示性能和渲染效率的更多相关文章
- 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader
最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...
- 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...
- 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性
JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...
- Android UI开发第三十五篇——AppCompat实现Action Bar
每一位Android开发者对Action Bar这种设计都不陌生了,毕竟它已经发布了至少两年了.Android团队发布Action Bar设计规范时同时放出了ActionBar的Api来支持这种设计. ...
- 树莓派开发笔记(十五):树莓派4B+从源码编译安装mysql数据库
前言 树莓派使用数据库时,优先选择sqlite数据库,但是sqlite是文件数据库同时仅针对于单用户的情况,考虑到多用户的情况,在树莓派上部署安装mysql服务,通过读写锁事务等使用,可以实现多进 ...
- Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析
一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...
- BizTalk开发系列(三十五) TCP/IP 适配器
BizTalk 的TCP/IP适配器最初是为英国的保健行业开发.该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯. TCP/IP适 ...
- Java开发笔记(十五)短路逻辑运算的优势
前面提到逻辑运算只能操作布尔变量,这其实是不严谨的,因为经过Java编程实现,会发现“&”.“|”.“^”这几个逻辑符号竟然可以对数字进行运算.譬如下面的代码就直接对数字分别开展了“与”.“或 ...
- .Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)
上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的两个Demo,也都采用了“泵”模式 ...
- PHP学习笔记三十五【Try】
<?php function AddUser($name) { if($name=="张三") { echo "add success"; return ...
随机推荐
- C# and TypeScript – Enum Flags
前言 以前就有提过 Enum Flags,但平日不常用.最近翻 Angular 源码,发现它很多地方用到,而且没有封装语义代码.一堆符号真的看不惯啊... 于是又去复习了一遍,熟悉熟悉.顺便写一篇做记 ...
- CSS – 屏幕, 打印, 分辨率, 物理像素, 逻辑像素, Retina, DPI, PPI 是什么?
前言 之前就有写过关于 Retina 和 Responsive Image 响应式图片 (responsive image) Retina 显示屏 但写的很烂, 这篇从新整理一下. 参考: 掌握web ...
- 华为测试岗上岸,月入20K,面试无非就是这些套路!
软件测试工程师,和开发工程师相比起来,虽然前期可能不会太深,但是涉及的面还是比较广的.涉及的知识主要有 MySQL 数据库的使用.Linux 操作系统的使用.软件测试框架性的问题,测试环境搭建问题.当 ...
- 如何安装eNSP
如何安装eNSP? eNSP是需要三个插件进行辅助的,所以先下三个插件,最后在下eNSP 首先来看看Wireshark的安装 很简单,基本上就直接下一步就行 这里直接下一步 这里要注意,这些要么安装在 ...
- 形参和实参的区别 and 联系
联系:形参和实参是赋值关系,是按照值传递的,简单数据直接传递值,形参和实参的改变互不影响,因为形参和实参是两个变量,是两个数据(栈内存): 引用数据传递的是地址,结果就是一个数据,两个地址同时指向一个 ...
- 介绍一下 websocket
一般的http请求都是短连接,而webpack的使用可以建立长连接 : 什么是 websocket websocket 是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双 ...
- 59.ref和reactive的区别
首先,ref和reactive 定义响应式数据的,& vue3中的数据分为 2 类,一类没有响应式数据 第二类是响应式数据 : 如果没有使用ref 或者 reactive 定义数据,那么默认是 ...
- KubeSphere 社区双周报| 2024.08.30-09.12
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- Python面向对象小备忘
最近学到面向对象了,感觉到Python这方面的语法也有点神奇,这里专门归纳一下Python面向对象中我觉得比较重要的笔记. 本文目前有的内容:实例属性和类属性的访问,使用@property修饰器 实例 ...
- springBoot项目启动卡在Root WebApplicationContext: initialization completed... (非DEBUG断点问题)
通过源码启动排查发现,初始化连接池时创建了200次,通过配置文件中将initialSize值改为10,启动时间从1分钟变为了3秒.