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

目录

1. 前言

2. osgViewer::StatsHandler

2.1. 功能与用法说明

2.2. 主要接口说明

3. osg::Stats

4. 附录


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
#include
#include

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键的信息外,还统计和视景器相关的信息,如下:

浅谈osgViewer::StatsHandler、osg::Stats类的用法_第1张图片图2 

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

浅谈osgViewer::StatsHandler、osg::Stats类的用法_第2张图片

图3 

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

浅谈osgViewer::StatsHandler、osg::Stats类的用法_第3张图片

图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类来实现统计信息的。

4. 附录

osg其它事件处理器用法参见如下博文:

  • osgViewer中的WindowSizeHandler和osgGA中的StateSetManipulator事件处理器用法
  • osgViewer中的ScreenCaptureHandler、LODScaleHandler、HelpHandler事件处理器用法

你可能感兴趣的:(#,osg基础技术点,StatsHandle,Stats)