osg::Stats类用法及该类源码剖析

1. 概述

      Stats是英文单词statistics的简写。顾名思义,就知道osg::Stats是osg中用来统计某些信息的类,如:帧率等,在osg中很多地方用到该类统计某些信息,如下代码是摘自osg的Viewer::eventTraversal()函数,该段代码记录了osg事件开始遍历时刻、事件遍历完的时刻、时间遍历耗时时长信息:

void Viewer::eventTraversal()
{...... // 其它代码略if (getViewerStats() && getViewerStats()->collectStats("event")){double endEventTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());// update current frames statsgetViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal begin time", beginEventTraversal);getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal end time", endEventTraversal);getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Event traversal time taken", endEventTraversal-beginEventTraversal);}...... // 其它代码略
}

如下代码是摘自osg的Viewer::renderingTraversals()函数,记录了某些必要的信息:

void ViewerBase::renderingTraversals()
{...... // 其它代码略stats->setAttribute(frameNumber, "Number of unique StateSet", static_cast<double>(statsVisitor._statesetSet.size()));stats->setAttribute(frameNumber, "Number of unique Group", static_cast<double>(statsVisitor._groupSet.size()));stats->setAttribute(frameNumber, "Number of unique Transform", static_cast<double>(statsVisitor._transformSet.size()));stats->setAttribute(frameNumber, "Number of unique LOD", static_cast<double>(statsVisitor._lodSet.size()));stats->setAttribute(frameNumber, "Number of unique Switch", static_cast<double>(statsVisitor._switchSet.size()));stats->setAttribute(frameNumber, "Number of unique Geode", static_cast<double>(statsVisitor._geodeSet.size()));stats->setAttribute(frameNumber, "Number of unique Drawable", static_cast<double>(statsVisitor._drawableSet.size()));stats->setAttribute(frameNumber, "Number of unique Geometry", static_cast<double>(statsVisitor._geometrySet.size()));stats->setAttribute(frameNumber, "Number of unique Vertices", static_cast<double>(statsVisitor._uniqueStats._vertexCount));stats->setAttribute(frameNumber, "Number of unique Primitives", static_cast<double>(unique_primitives));...... // 其它代码略stats->setAttribute(frameNumber, "Number of instanced Stateset", static_cast<double>(statsVisitor._numInstancedStateSet));stats->setAttribute(frameNumber, "Number of instanced Group", static_cast<double>(statsVisitor._numInstancedGroup));stats->setAttribute(frameNumber, "Number of instanced Transform", static_cast<double>(statsVisitor._numInstancedTransform));stats->setAttribute(frameNumber, "Number of instanced LOD", static_cast<double>(statsVisitor._numInstancedLOD));stats->setAttribute(frameNumber, "Number of instanced Switch", static_cast<double>(statsVisitor._numInstancedSwitch));stats->setAttribute(frameNumber, "Number of instanced Geode", static_cast<double>(statsVisitor._numInstancedGeode));stats->setAttribute(frameNumber, "Number of instanced Drawable", static_cast<double>(statsVisitor._numInstancedDrawable));stats->setAttribute(frameNumber, "Number of instanced Geometry", static_cast<double>(statsVisitor._numInstancedGeometry));stats->setAttribute(frameNumber, "Number of instanced Vertices", static_cast<double>(statsVisitor._instancedStats._vertexCount));stats->setAttribute(frameNumber, "Number of instanced Primitives", static_cast<double>(instanced_primitives));
...... // 其它代码略getViewerStats()->setAttribute(frameNumber, "Rendering traversals begin time ", beginRenderingTraversals);getViewerStats()->setAttribute(frameNumber, "Rendering traversals end time ", endRenderingTraversals);getViewerStats()->setAttribute(frameNumber, "Rendering traversals time taken", endRenderingTraversals-beginRenderingTraversals);...... // 其它代码略
}

本博文讲述osg::Stats类用法及对其实现进行源码剖析。

2.代码环境说明

环境说明如下:

  • OpenSceneGraph-3.6.2。
  • Windows 10。
  • Microsoft Visual Studio Community 2022 (64 位) - Current
    版本 17.5.5。

说明:本博文是基于OpenSceneGraph的3.6.2版本来讲解的,读者版本可能和本人的版本不同,故本人的源码或功能可能在细节上和读者的有所不同。

3.Stats类用法说明

3.1. 函数接口说明

本节只讲述public接口,Stats类内部调用的private、protected接口不讲述。

Stats(const std::string& name);
Stats(const std::string& name, unsigned int numberOfFrames);

        这两个都为构造函数,参数name用来区分不同Stats类对象,参数numberOfFrames表示Stats类每次统计多少帧的帧信息,如果不传入该参数(此时是调用第1个构造函数的情况),则默认统计25帧的帧信息。

void allocate(unsigned int numberOfFrames);

       本函数为统计帧数为numberOfFrames的帧开辟内存空间,看看源码就知道其实就是分配一个大小为numberOfFrames的vector,该vector中的每个元素是一个map,该map存放该帧的每种属性键值对。

 bool setAttribute(unsigned int frameNumber, const std::string& attributeName, double value);

        本函数将帧索引号为frameNumber的帧的属性名为attributeName,属性值为value保存到内存,即allocate开辟的内存空间。

inline bool getAttribute(unsigned int frameNumber, const std::string& attributeName, double& value) const

本函数是setAttribute函数的逆函数,功能将帧索引号为frameNumber的帧,该帧的属性为attributeName的取出来存放到第三个参数value中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7.6安装RabbitMQ

前言&#xff1a;因为RabbitMQ是ERlang语言编写所以要先安装ERlang再安装RabbitMQ 安装ERlang 借鉴前辈原文地址&#xff1a;https://www.cnblogs.com/fengyumeng/p/11133924.html 第一步&#xff1a;安装依赖 yum -y install gcc glibc-devel make ncurses-devel open…

快速上手 Spring Boot:基础使用详解

快速上手 Spring Boot&#xff1a;基础使用详解 文章目录 快速上手 Spring Boot&#xff1a;基础使用详解1、什么是SpringBoot2、Springboot快速入门搭建3、SpringBoot起步依赖4、SpringBoot自动配置&#xff1a;以tomcat启动为例5、SpringBoot基础配置6、yaml7、多环境开发配置…

使用Ghostscript将PostScript(.ps)文件转换为PDF文件格式

如何使用Ghostscript将PostScript文件转换为PDF文件格式: /* Example of using GS DLL as a ps2pdf converter. */#if defined(_WIN32) && !defined(_Windows) # define _Windows #endif #ifdef _Windows /* add this source to a project with gsdll32.dll, or comp…

顶尖项目经理都在用的SOP

接受任务SOP 了解任务背景了解任务目标&#xff08;包含deadline&#xff09;拆解任务&#xff0c;确认负责人执行方案审批确认跟进执行并定期汇报验收结果&#xff0c;进行反馈相关文档存档&#xff0c;形成闭环 推进任务SOP - PDCA循环 制定计划 Plan。依据目标&#xff0c…

MacBook Pro 忘记root用户密码,重置密码步骤

一、以普通用户名登录系统&#xff0c;并打开terminal终端&#xff0c; 输入&#xff1a;sudo bash sudo bash Password:*****&#xff08;输入当前用户的密码&#xff09; 成功后进入bash-3.2#的命令模式 二、在bash-3.2#命令模式下 输入&#xff1a;sudo passwd root sud…

生信算法8 - HGVS转换与氨基酸字母表

HGVS 概念 HGVS 人类基因组变异协会(Human Genome Variation Society)提出的转录本编号&#xff0c;cDNA 参考序列(以前缀“c.”表示)、氨基酸参考序列(以前缀“p.”表示)。cDNA 中一种碱基被另一种碱基取代&#xff0c;以“>”进行表示&#xff0c;如&#xff1a;c.2186A&…

python数据分析——数据预处理

数据预处理 前言一、查看数据数据表的基本信息查看info&#xff08;&#xff09;示例 查看数据表的大小shape&#xff08;&#xff09;示例 数据格式的查看type()dtype&#xff08;&#xff09;dtypes&#xff08;&#xff09;示例一示例二 查看具体的数据分布describe()示例 二…

算法常见手写代码

1.NMS def py_cpu_nms(dets, thresh):"""Pure Python NMS baseline."""#x1、y1、x2、y2、以及score赋值x1 dets[:, 0]y1 dets[:, 1]x2 dets[:, 2]y2 dets[:, 3]scores dets[:, 4]#每一个检测框的面积areas (x2 - x1 1) * (y2 - y1 1)#按…

Windows环境如何ssh远程连接本地局域网内的Archcraft系统

文章目录 前言1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接小结 5. 固定SSH公网地址6. SSH固定地址连接 前言 本文主要介绍如何在Archcraft系统中安装Cpolar内网穿透工具,并以实现Windows环境ssh远程连接本地局域网Archcraft系统来说明使用…

相位和展开相位

相位 (Phase) 相位是一个周期信号在一个周期内的位置&#xff0c;通常以角度&#xff08;度或弧度&#xff09;表示。在许多应用中&#xff0c;相位被限制在一个周期内。例如&#xff0c;相位通常被限定在 −180∘到 180∘ 或 0∘ 到 360∘ 之间。 示例 −90∘ 表示信号在周…

从基础到高级:视频直播美颜SDK的开发教学

本篇文章&#xff0c;小编将从基础到高级&#xff0c;详细讲解视频直播美颜SDK的开发过程&#xff0c;帮助开发者更好地掌握这一技术。 一、基础知识 什么是视频直播美颜SDK&#xff1f; 视频直播美颜SDK包含了一系列用于视频处理的功能模块&#xff0c;特别是美颜效果的实现…

C++支持哪些继承类型?

在C中&#xff0c;继承是一种面向对象编程&#xff08;OOP&#xff09;的特性&#xff0c;它允许一个类&#xff08;称为派生类或子类&#xff09;使用另一个类&#xff08;称为基类或父类&#xff09;的属性和方法。这种机制提高了代码的重用性&#xff0c;减少了代码的冗余&a…

Linux高并发服务器开发(一)GCC和Make

文章目录 1 工作流程2 静态库和动态库连接2.1 静态连接2.2 动态链接 3 静态库制作和使用4 动态库的制作和使用5 GDB 调试器6 Makefile 1 工作流程 第一步预处理&#xff0c;生成.i 第二部生成汇编文件.s 第三部生成目标代码.o 第四部生成可执行文件 2 静态库和动态库连接 2.1…

使用Mixamo极简绑骨,导入unity中使用

如果你只想专注于角色建模&#xff0c;对于动画设计没有过多精力&#xff1b;如果你想白嫖别人的角色动画&#xff0c;用到自己的模型上&#xff1b;那么&#xff0c;这个网站很适合你&#xff1a;https://www.mixamo.com/ 操作步骤&#xff1a; 首先将自己的模型上传到这个网…

精确控制激励功率,保障晶振正常工作

随着科技的发展&#xff0c;晶振在电子产品中的应用越来越广泛。作为电路中的重要组成部分&#xff0c;晶振的性能直接影响着整个电路的稳定性和可靠性。激励功率是影响晶振性能的关键因素之一&#xff0c;因此&#xff0c;对晶振激励功率的控制至关重要。 一、激励功率的含义…

海外短剧系统,开启你的国际视野

一、海外短剧系统是一个创新且富有吸引力的平台&#xff0c;它能够为用户提供来自世界各地的精彩短剧&#xff0c;从而开启用户的国际视野。 1、文化多样性&#xff1a;海外短剧系统汇集了来自不同国家和地区的短剧作品&#xff0c;这些作品反映了各自独特的文化背景和社会风貌…

在 Git 中创建新分支

在 Git 中创建新分支非常简单。你可以使用 git branch 命令来创建一个新的分支。以下是如何创建新分支的步骤&#xff1a; 首先&#xff0c;确保你当前在 Git 仓库的某个分支上。你可以使用 git status 来查看你当前所在的分支。 使用 git branch <branch-name> 命令来创…

主变变压器保护屏组成,功能介绍

主变变压器保护屏组成&#xff0c;功能介绍 在电力系统中&#xff0c;主变变压器是核心设备之一&#xff0c;对于保障电力系统的稳定运行起着至关重要的作用。为了确保主变变压器的正常运行&#xff0c;需要采用各种保护措施。其中&#xff0c;主变变压器保护屏是其中的重要组成…

Bootstrap 5 网格系统

Bootstrap 5 网格系统 Bootstrap 5 是目前最流行的前端框架之一,它提供了一套强大的网格系统,帮助开发者快速构建响应式布局。本文将详细介绍 Bootstrap 5 的网格系统,包括其工作原理、使用方法以及最佳实践。 什么是 Bootstrap 网格系统? Bootstrap 网格系统是一种基于…

高效DEBUG事务正确性BUG

作者&#xff1a;张旭 MO研发工程师 目录 Part 1. 事务回顾 Part 2. 事务的正确性问题 Part 3. 如何高效 DEBUG 熟悉数据库分布式事务的读者&#xff0c;应该能够理解DEBUG分布式事务正确性问题的BUG是一件非常有挑战的事情。本文主要是给大家介绍一下&#xff0c;MatrixO…