osg状态信息统计的实现原理

本文介绍了osgViewer::Viewer如何利用osgView::StatsHandler进行状态信息统计。osgView::StatsHandler的handle函数处理s键响应,通过osg::Switch切换显示不同的统计信息。统计信息的动态绘制借助于绘制回调函数,而信息获取涉及帧率、视图、事件、更新、裁剪、绘制、GPU绘制和渲染遍历等多个方面。
摘要由CSDN通过智能技术生成

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(_
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值