前言

  在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:优化场景策略,提升显示性能和渲染效率的更多相关文章

  1. 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader

    最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...

  2. 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

    摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...

  3. 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性

    JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...

  4. Android UI开发第三十五篇——AppCompat实现Action Bar

    每一位Android开发者对Action Bar这种设计都不陌生了,毕竟它已经发布了至少两年了.Android团队发布Action Bar设计规范时同时放出了ActionBar的Api来支持这种设计. ...

  5. 树莓派开发笔记(十五):树莓派4B+从源码编译安装mysql数据库

    前言   树莓派使用数据库时,优先选择sqlite数据库,但是sqlite是文件数据库同时仅针对于单用户的情况,考虑到多用户的情况,在树莓派上部署安装mysql服务,通过读写锁事务等使用,可以实现多进 ...

  6. Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析

    一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 使用了 Spring 框架后已经简化了我 ...

  7. BizTalk开发系列(三十五) TCP/IP 适配器

    BizTalk 的TCP/IP适配器最初是为英国的保健行业开发.该适配器属于BizTalk进程内适配器,将消息通过TCP/IP 套接字符串在BizTalk服务器与远程客户端间进行通讯. TCP/IP适 ...

  8. Java开发笔记(十五)短路逻辑运算的优势

    前面提到逻辑运算只能操作布尔变量,这其实是不严谨的,因为经过Java编程实现,会发现“&”.“|”.“^”这几个逻辑符号竟然可以对数字进行运算.譬如下面的代码就直接对数字分别开展了“与”.“或 ...

  9. .Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)

    上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的两个Demo,也都采用了“泵”模式 ...

  10. PHP学习笔记三十五【Try】

    <?php function AddUser($name) { if($name=="张三") { echo "add success"; return ...

随机推荐

  1. node: /lib64/libm.so.6: version `GLIBC_2.27‘ not found问题解决方案

    场景 centos7服务器使用nvm安装的node之后,只要使用npm或者node,均会出现以下问题. npm -v node: /lib64/libm.so.6: version `GLIBC_2. ...

  2. 使用VSCode搭建UniApp + TS + Vue3 + Vite项目

    uniapp是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.以及各种小程序.深受广大前端开发者的喜爱.uniapp官方也提供了自己的IDE工具HBui ...

  3. 海光 FTPM 运行报错:Fapi_Provision_Finish() ErrorCode (0x00060025) No EK certificate found.

    使用的是海光 CPU 提供的基于固件的 FTPM,错误原因是海光没有给 TPM 提供相应的 EK 证书.从而导致Fapi_Provision()接口无法通过证书的校验.关于Fapi_Provision ...

  4. 合合信息扫描全能王发布“黑科技”,让AI替人“思考”图像处理问题

    现阶段,手机扫描正越来越多地进入到人们的生活中.随着扫描应用场景的不断拓宽,诸多细节的问题逐渐显露,比如使用者在拍照扫描文档时,手指不小心"入镜"了,只能重拍:拍电脑屏幕时,画面上 ...

  5. JavaScript – 基本语法

    参考 阮一峰 – 基本语法 Switch switch 经常用来取代 else if, 因为可读性比价高, 而且通常性能也比较好. standard 长这样 const orderStatus = ' ...

  6. springboot-实现csv文件导出功能

    excle文件导出,会遇到一个65535行限制的问题,就是导出的数据行数超过65535行就会导出失败,这个是excle本生的限制,这种情况下通常将导出的格式改成csv这样就可以跨过这个限制,同时生成的 ...

  7. POJ-2229 Sumsets(基础dp)

    Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...

  8. Java日期时间API系列34-----Jdk8中java.time包中的新的日期时间API类应用,使用Period一行代码计算生日。

    通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别中得知,Period可以比较2个日期相差的年月日.年龄计算是2个日 ...

  9. 简述 JavaScript脚本的执行原理?

    js 是一种动态 . 弱类型 . 基于原型的语言 ,通过浏览器可以直接执行: 当浏览器遇到 <script></script>标记时 , 会执行标记之间的js 代码:然后js ...

  10. 10-react不同层级的组件之间的数据传递数据 createContext 上下文

    // 组件传值 props 接收传递过来的数据 import ReactDom from "react-dom" import { createContext, Component ...