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中。