osgViewer::Viewer首先添加osgView::StatsHandler负责统计信息的处理
osgView::StatsHandle中的handle函数具体负责s键的响应和切换。
osgViewer/StatsHandler.cpp
bool StatsHandler::handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::KEYDOWN):
{
if (ea.getKey()==_keyEventTogglesOnScreenStats)
{
switch(_statsType)
{
case(NO_STATS):
case(FRAME_RATE):
case(VIEWER_STATS):
case(CAMERA_SCENE_STATS):
case(VIEWER_SCENE_STATS):
}
}
}
}
}
统计信息的切换显示是通过osg::Switch实现的,每一个统计信息为其中的一个osg::Group。动态信息的绘制是通过绘制回调函数来实现的(在osgViewer::StatsHandler::setUpSecne中实现):
frameRateValue->setDrawCallback(new AveragedValueTextDrawCallback(viewer->getViewerStats(),"Frame rate",-1, true, 1.0));
frameMarkers->setDrawCallback(new FrameMarkerDrawCallback(this, _startBlocks, viewer->getViewerStats(), 0, _numBlocks + 1));
camStatsText->setDrawCallback(new CameraSceneStatsTextDrawCallback(*citr, cameraCounter));
text->setDrawCallback(new ViewSceneStatsTextDrawCallback(*it, viewCounter));
统计信息的获取是在如下位置:
1、获取帧速率的信息
osgViewer/Vierwer.cpp
void Viewer::advance(double simulationTime)
{
if (getViewerStats() && getViewerStats()->collectStats("frame_rate"))
{
// update previous frame stats
double deltaFrameTime = _frameStamp->getReferenceTime() - previousReferenceTime;
getViewerStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);
getViewerStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);
// update current frames stats
getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());
}
}
2、获取视图的统计信息
2.1、获取事件遍历的统计信息
osgViewer/Vierwer.cpp
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);
}
}
2.2、获取更新遍历的统计信息
osgViewer/Vierwer.cpp
void Viewer::updateTraversal()
{
if (getViewerStats() && getViewerStats()->collectStats("update"))
{
double endUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
// update current frames stats
getViewerStats()->setAttribute(_