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

发布于:2024-06-24 ⋅ 阅读:(49) ⋅ 点赞:(0)

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 stats
        getViewerStats()->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中。


网站公告

今日签到

点亮在社区的每一天
去签到