浅谈osgViewer::StatsHandler、osg::Stats类的用法

news2024/10/7 13:25:36

目录

1. 前言

2. osgViewer::StatsHandler

2.1. 功能与用法说明

2.2. 主要接口说明

3. osg::Stats


1. 前言

           osg为视景器的使用和调试提供了丰富的辅助组件,它们主要是以osg::ViewerBase的成员变量或交互事件处理器(osgGA::GUIEventHandler)的形式出现。osgViewer::StatsHandler、osg::Stats类就是其中的两个经常用到的辅助组件。

2. osgViewer::StatsHandler

2.1. 功能与用法说明

      osgViewer::StatsHandler类的头文件位于osg源码目录下的:

include\osgViewer\ViewerEventHandlers

文件; osgViewer::StatsHandler类的cpp文件位于osg源码目录下的:

src\osgViewer\StatsHandler.cpp

        该类的功能为向视景器osgViewer::Viewer(单视图)或osgViewer::CompositeViewer(多视图)输出屏幕统计信息。如下代码:

#include<osgViewer/Viewer>
#include<osgDB/readFile>
#include<osgViewer/ViewerEventHandlers>

int main(int argc, char* argv[])
{
    osg::ArgumentParser arguments(&argc, argv);
    osg::setNotifyLevel(osg::INFO);
    osgViewer::Viewer viewer(arguments);
    auto pNode = osgDB::readNodeFile(R"(E:\osg\OpenSceneGraph-Data\cow.osg)");
    if (nullptr == pNode)
    {
        OSG_WARN << "file not exist!\r\n";
        return 1;
    }

    auto pStatsEventHandler = new osgViewer::StatsHandler; // 构造一视景器统计事件处理器
    viewer.addEventHandler(pStatsEventHandler);  // 向视景器增加统计事件处理器
    viewer.setSceneData(pNode);
    return viewer.run();
}

为视景器对象viewer增加了一个pStatsEventHandler的统计事件处理器对象。一旦程序运行起来,默认情况下,第1次按小写s键,则只统计帧率,如下:

图1 

第2次按小写s键时,保持第1次按下s键的信息外,还统计和视景器相关的信息,如下:

图2 

当3次按下小写s键时, 保持第1、2次按下s键的信息外,还所有相机和场景相关的信息,如下:

图3 

 当4次按下小写s键时, 保持第1、2、3次按下s键的信息外,还统计所有视景器和场景相关的信息,如下:

图4

       当5次按下小写s键时,则清除图1到图4的所有输出信息,程序保证按下s的次数不会超过5,当达到5时,自动回到0,然后每次按下小写s键,自动加1,递增到5。按下大写S时,则将统计信息输出到标准控制台窗口。一个综合统计图如下所示:

图5

上述统计的信息主要信息说明如下:

参    数   名       参   数   含   义   备                                          注
Frame Rate 当前帧率在debug模式下为DEBUG Frame Rate
ThreadingModel线程模式ViewerBase::ThreadingModel枚举类型
Event一帧内交互事件耗费的时间单位:秒
Update一帧内场景更新耗费的时间单位:秒
Cull一帧内场景裁剪耗费的时间单位:秒
Draw渲染一帧耗费的时间单位:秒
GPU渲染一帧时,GPU耗费的时间单位:秒
Drawable场景内独立可绘制体总数
Geode场景内独立可绘叶节点总数
Vertices场景内独立顶点总数
Primitives场景内独立可图元数

因为统计的参数很多,其它参数含义请参见StatsHandler.cpp类源码。

2.2. 主要接口说明

osgViewer::StatEventHandler类主要接口说明如下:

void setKeyEventTogglesOnScreenStats(int key);
int getKeyEventTogglesOnScreenStats() const; 

上述接口功能为:设置或获取统计信息输出到屏幕的按键,默认为小写的s,可以设置为其它键,参数key是osgGA::GUIEventAdapter::KeySymbol枚举,即键盘虚拟码。如下将默认的小写s键改为数字0键作为统计信息的输出按下,此时按下0才能输出统计信息,s不再其作用:

auto pStatsEventHandler = new osgViewer::StatsHandler; // 构造一视景器统计事件处理器
pStatsEventHandler ->setKeyEventTogglesOnScreenStats(osgGA::GUIEventAdapter::KEY_0);

 下面接口:

void setKeyEventPrintsOutStats(int key);
int getKeyEventPrintsOutStats() const ;

功能为:设置或获取统计信息输出到控制台窗口的按键,同上面的类似,不再赘述。

void reset();

上面接口功能为:重置统计信息,此时界面上不会有任何统计信息。注意和按下默认的s键或设定的统计信息键累计5次不输出统计信息的不同:重置是将用于输出统计信息的相机的图形设备上下文对象及相机孩子对象都清空,这样会释放内存,而后者则不会。

3. osg::Stats

         视景器osgViewer::Viewer(单视图)或osgViewer::CompositeViewer(多视图)对象(为了便于后文描述,暂称为viewer)可以通过如下代码获取osg::Stats对象:

viewer.getViewerStats();

然后使用osg::Stats对象的如下接口设置或获取指定帧索引下指定属性名的属性值:

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

如下为获取第100帧时的帧速率:

double frameRate;
viewer.getViewerStats()->getAttribute(100, "Frame rate", frameRate);

这两个函数第2个参数表示的主要属性名如下表所示:

          属性名含                      义
Frame rate帧率
Event traversal time taken一帧内交互事件耗费的时间(单位:秒)
Update traversal time taken更新场景一帧耗费时间(单位:秒)
Cull traversal time taken一帧内场景裁剪耗费的时间(单位:秒)
GPU draw time taken渲染一帧时,GPU耗费的时间(单位:秒)
Draw traversal time taken场景内独立可绘制体总数
Number of unique Geode场景内独立的叶节点总数
Reference time系统运行事件(单位:秒)
Number of unique Geometry场景内独立几何体总数
Number of unique Vertices场景内独立顶点总数
Number of unique Primitives场景内独立图元总数

因为统计的参数很多,其它参数含义请参见StatsHandler.cpp类源码。其实osgViewer::StatEventHandler类内部就是通过osg::Stats类来实现统计信息的。

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

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

相关文章

Linux线程:死锁

1. 死锁 &#xff08;1&#xff09;概念 死锁&#xff08;DeadLock&#xff09;指两个或两个以上的进程或线程执行时&#xff0c;由于竞争临界资源而造成阻塞的现象&#xff1b;若不干涉&#xff0c;则无法推进下去。 &#xff08;2&#xff09;死锁的原因 ① 竞争临界资源…

商业运营级Java定位系统源代码

智慧工厂人员定位系统源码 技术架构&#xff1a;Java vue spring boot 系统概述&#xff1a; 采用UWB定位技术&#xff0c;通过在厂区内布设一定数量的定位基站&#xff0c;实时精确地定位员工、车辆、物品上微标签位置&#xff0c;零延时地将人、车、物的位置信息显示在工厂…

8年测试老鸟谈,性能测试-测试环境搭建与常见问题,这些你都知道吗?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一个问题&#xf…

千模大战鏖战正酣,大模型能否帮360重回巅峰?

ChatGPT问世后&#xff0c;互联网终于看到了变革的曙光。 回望互联网的征程&#xff0c;几乎每十年左右&#xff0c;就会因产品和技术的变革&#xff0c;而催生出全新的应用场景。 00年代&#xff0c;随着PC产品的逐渐成熟&#xff0c;桌面互联网成为时代的“主旋律”。在此背…

ChatGPT提示词工程(七):Chatbot聊天机器人

目录 一、说明二、安装环境1. 辅助函数&#xff1a;get_completion2. 辅助函数&#xff1a;get_completion_from_messages 三、聊天机器人&#xff08;Chatbot&#xff09;1. 一般聊天机器人1.1 简单的例子1.2 多轮对话 2. 订单机器人 一、说明 这是吴恩达 《ChatGPT Prompt E…

Jackson使用详解

Spring MVC 默认采用Jackson解析Json&#xff0c;尽管还有一些其它同样优秀的json解析工具&#xff0c;例如Fast Json、GSON&#xff0c;但是出于最小依赖的考虑&#xff0c;也许Json解析第一选择就应该是Jackson。 一、简介 Jackson 是当前用的比较广泛的&#xff0c;用来序…

【Spring框架全系列】第一个Spring程序

&#x1f3d9;哈喽&#xff0c;大家好&#xff0c;我是小浪。那么从今天开始&#xff0c;我就要开始更新spring框架全系列的博客了&#xff1b;本专栏免费阅读&#xff0c;最好能够点个订阅&#xff0c;以便于后续及时收到更新信息哈&#xff01;&#x1f3df; &#x1f4f2;目…

【Java EE 初阶】线程的常用方法

目录 1.多线程的作用 2.示例&#xff1a;分别对两个变量实现10亿次自增 1.使用串行&#xff08;单线程&#xff09; 2.使用并行&#xff08;多线程&#xff09; 结果显示&#xff1a; 3.线程的类构造方法 代码展示&#xff1a; 4.Thread类的常见属性 1.演示各个属性 2.演…

( 数组和矩阵) 378. 有序矩阵中第 K 小的元素 ——【Leetcode每日一题】

❓378. 有序矩阵中第 K 小的元素 难度&#xff1a;中等 给你一个 n x n n x n nxn 矩阵 m a t r i x matrix matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 …

InnoDB存储引擎B+树的树高推导

目录 一、基本结论&#xff1a;InnoDB存储引擎B树的树高3-4层 二、存储引擎B树结构简单分析 三、主键索引B树推导 四、InnoDB页的内部结构推导 五、剖析InnoDB数据文件推导 六、一般思路推导计算B树高度总结 参考文献、书籍及链接 一、基本结论&#xff1a;InnoDB存储引…

uni-app实战笔记

3 页面跳转 点击【成员列表】进入到子页面&#xff0c;这里就涉及到页面跳转。 路由是基础并不难&#xff0c;但是路由跳转的方式比较灵活&#xff0c;这里就需要记录一下。有一点是需要配置的&#xff0c;就是在pages.json中需要将路由整理好&#xff0c;否则页面是无法跳转的…

Hive架构原理以及部署教程

◆了解Hive架构原理 ◆了解Hive和RDBMS的对比 Hive架构原理 Hive架构原理 - 知乎 Hive 是基于 Hadoop 的数据仓库工具&#xff0c;它提供了类 SQL 查询语言 HQL&#xff08;Hive Query Language&#xff09;&#xff0c;可以将 SQL 语句转化为 MapReduce 任务进行数据处理。 Hi…

【软考备战·希赛网每日一练】2023年5月2日

文章目录 一、今日成绩二、错题总结第一题 三、知识查缺 题目及解析来源&#xff1a;2023年05月02日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 三、知识查缺 复习 流水线技术。序列图&#xff08;顺序图&#xff09;用于展现系统中一个用例和多…

剪枝与重参第九课:DBB重参

目录 DBB重参前言1. DBB2. DBB的六种变换2.1 Transform I: a conv for conv-BN2.2 Transform II&#xff1a;a conv for branch addition2.3 Transform III&#xff1a;a conv for sequential convolutions2.4 Transform IV&#xff1a;a conv for depth concatenation2.5 Tran…

【SpringBoot】 整合RabbitMQ 消息单独以及批量的TTL

生产者端 目录结构 导入依赖 修改yml 业务逻辑 队列消息过期 消息单独过期 TTL&#xff08;Time To Live&#xff09;存活时间。表示当消息由生产端存入MQ当中的存活时间&#xff0c;当时间到达的时候还未被消息就会被自动清除。RabbitMQ可以对消息单独设置过期时间也可以对…

爬虫 - QS世界大学排名数据

爬虫 - QS世界大学排名数据 网站简介爬虫方法概述使用工具爬虫概述 第一部分导入需要用到的python包设置selenium控制浏览器打开网页控制鼠标操作定位节点 提取数据滚轮翻页构建循环自动爬取数据数据储存 第二部分导入需要用到的python包获取网页设置请求头读取链接获取网页信息…

TIM-定时器——STM32

TIM-定时器——STM32 TIM(Timer)定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能&#xff0c;而且还包…

K8S第二讲 Kubernetes集群简易版搭建步骤

Kubernetes集群搭建步骤 1&#xff1a;准备物理或虚拟机器 为Kubernetes集群准备物理或虚拟机器。至少需要一个控制节点&#xff08;Master Node&#xff09;和一个工作节点&#xff08;Worker Node&#xff09;&#xff0c;建议使用Linux操作系统。 2&#xff1a; 安装Dock…

1987-2021年全国各省进出口总额数据含进口总额和出口总额

1987-2021年全国各省进出口总额数据含进口和出口 1、时间&#xff1a;1987-2021年 2、范围&#xff1a;包括全国30个省不含西藏 3、指标&#xff1a;进出口总额、进口总额、出口总额 4、单位&#xff1a;万美元 5、来源&#xff1a;各省NJ、JIN rong统计NJ 6、缺失情况说…

递归算法及经典例题详解

大部分人在学习编程时接触的第一个算法应该就是递归了&#xff0c;递归的思想其实很好理解&#xff0c;就是将一个问题拆分为若干个与本身相似的子问题&#xff0c;通过不断调用自身来求解。 但很多新手在实际操作中却很难正确使用到递归&#xff0c;有时面对问题还会有种无从…