Changeset 9552

Show
Ignore:
Timestamp:
01/26/09 22:23:09 (6 years ago)
Author:
robert
Message:

Ported onscreen camera stats across to using thread safe stats collection

Location:
OpenSceneGraph/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osgUtil/Statistics

    r9377 r9552  
    116116    public: 
    117117                 
     118        PrimitiveCountMap& getPrimitiveCountMap() { return _primitives_count; } 
     119        const PrimitiveCountMap& getPrimitiveCountMap() const { return _primitives_count; } 
     120         
     121        /// deprecated 
    118122        PrimitiveCountMap::iterator GetPrimitivesBegin() { return _primitives_count.begin(); } 
     123        /// deprecated 
    119124        PrimitiveCountMap::iterator GetPrimitivesEnd() { return _primitives_count.end(); } 
    120125 
  • OpenSceneGraph/trunk/src/osgViewer/Renderer.cpp

    r9385 r9552  
    1818#include <osgUtil/Optimizer> 
    1919#include <osgUtil/GLObjectsVisitor> 
     20#include <osgUtil/Statistics> 
    2021 
    2122#include <osgViewer/Renderer> 
     
    335336        } 
    336337 
     338        if (stats && stats->collectStats("scene")) 
     339        { 
     340            osgUtil::Statistics sceneStats; 
     341            sceneView->getStats(sceneStats); 
     342             
     343            stats->setAttribute(frameNumber, "Visible vertex count", static_cast<double>(sceneStats._vertexCount)); 
     344            stats->setAttribute(frameNumber, "Visible number of drawables", static_cast<double>(sceneStats.numDrawables)); 
     345            stats->setAttribute(frameNumber, "Visible number of lights", static_cast<double>(sceneStats.nlights)); 
     346            stats->setAttribute(frameNumber, "Visible number of render bins", static_cast<double>(sceneStats.nbins)); 
     347            stats->setAttribute(frameNumber, "Visible depth", static_cast<double>(sceneStats.depth)); 
     348            stats->setAttribute(frameNumber, "Visible number of materials", static_cast<double>(sceneStats.nummat)); 
     349            stats->setAttribute(frameNumber, "Visible number of impostors", static_cast<double>(sceneStats.nimpostor)); 
     350 
     351            osgUtil::Statistics::PrimitiveCountMap& pcm = sceneStats.getPrimitiveCountMap(); 
     352            stats->setAttribute(frameNumber, "Visible number of GL_POINTS", static_cast<double>(pcm[GL_POINTS])); 
     353            stats->setAttribute(frameNumber, "Visible number of GL_LINES", static_cast<double>(pcm[GL_LINES])); 
     354            stats->setAttribute(frameNumber, "Visible number of GL_LINE_STRIP", static_cast<double>(pcm[GL_LINE_STRIP])); 
     355            stats->setAttribute(frameNumber, "Visible number of GL_LINE_LOOP", static_cast<double>(pcm[GL_LINE_LOOP])); 
     356            stats->setAttribute(frameNumber, "Visible number of GL_TRIANGLES", static_cast<double>(pcm[GL_TRIANGLES])); 
     357            stats->setAttribute(frameNumber, "Visible number of GL_TRIANGLE_STRIP", static_cast<double>(pcm[GL_TRIANGLE_STRIP])); 
     358            stats->setAttribute(frameNumber, "Visible number of GL_TRIANGLE_FAN", static_cast<double>(pcm[GL_TRIANGLE_FAN])); 
     359            stats->setAttribute(frameNumber, "Visible number of GL_QUADS", static_cast<double>(pcm[GL_QUADS])); 
     360            stats->setAttribute(frameNumber, "Visible number of GL_QUAD_STRIP", static_cast<double>(pcm[GL_QUAD_STRIP])); 
     361            stats->setAttribute(frameNumber, "Visible number of GL_POLYGON", static_cast<double>(pcm[GL_POLYGON])); 
     362             
     363        } 
     364 
    337365        _drawQueue.add(sceneView); 
    338366 
     
    457485            stats->setAttribute(frameNumber, "Draw traversal time taken", osg::Timer::instance()->delta_s(beforeDrawTick, afterDrawTick)); 
    458486        } 
     487 
    459488    } 
    460489 
     
    518547 
    519548    osg::Timer_t afterCullTick = osg::Timer::instance()->tick(); 
     549 
     550    if (stats && stats->collectStats("scene")) 
     551    { 
     552        osgUtil::Statistics sceneStats; 
     553        sceneView->getStats(sceneStats); 
     554 
     555        stats->setAttribute(frameNumber, "Visible vertex count", static_cast<double>(sceneStats._vertexCount)); 
     556        stats->setAttribute(frameNumber, "Visible number of drawables", static_cast<double>(sceneStats.numDrawables)); 
     557        stats->setAttribute(frameNumber, "Visible number of lights", static_cast<double>(sceneStats.nlights)); 
     558        stats->setAttribute(frameNumber, "Visible number of render bins", static_cast<double>(sceneStats.nbins)); 
     559        stats->setAttribute(frameNumber, "Visible depth", static_cast<double>(sceneStats.depth)); 
     560        stats->setAttribute(frameNumber, "Visible number of materials", static_cast<double>(sceneStats.nummat)); 
     561        stats->setAttribute(frameNumber, "Visible number of impostors", static_cast<double>(sceneStats.nimpostor)); 
     562    } 
    520563 
    521564#if 0 
  • OpenSceneGraph/trunk/src/osgViewer/StatsHandler.cpp

    r9385 r9552  
    9898                                ++itr) 
    9999                            { 
    100                                 if ((*itr)->getStats()) (*itr)->getStats()->collectStats("rendering",false); 
    101                                 if ((*itr)->getStats()) (*itr)->getStats()->collectStats("gpu",false); 
     100                                osg::Stats* stats = (*itr)->getStats(); 
     101                                if (stats) 
     102                                { 
     103                                    stats->collectStats("rendering",false); 
     104                                    stats->collectStats("gpu",false); 
     105                                    stats->collectStats("scene",false); 
     106                                } 
    102107                            } 
    103108                             
     109                            viewer->getStats()->collectStats("scene",false); 
     110 
    104111                            _camera->setNodeMask(0x0);  
    105112                            _switch->setAllChildrenOff(); 
     
    149156                            _camera->setNodeMask(0xffffffff); 
    150157                            _switch->setValue(_cameraSceneChildNum, true); 
     158 
     159                            for(osgViewer::ViewerBase::Cameras::iterator itr = cameras.begin(); 
     160                                itr != cameras.end(); 
     161                                ++itr) 
     162                            { 
     163                                osg::Stats* stats = (*itr)->getStats(); 
     164                                if (stats) 
     165                                { 
     166                                    stats->collectStats("scene",true); 
     167                                } 
     168                            } 
     169 
    151170                            break; 
    152171                        } 
     
    155174                            _camera->setNodeMask(0xffffffff); 
    156175                            _switch->setValue(_viewerSceneChildNum, true); 
     176 
     177                            viewer->getStats()->collectStats("scene",true); 
     178 
    157179                            break; 
    158180                        } 
     
    321343        _cameraNumber(cameraNumber) 
    322344    { 
    323  
    324         _primitiveModeStreamMap[osg::PrimitiveSet::POINTS] = &stream[0]; 
    325         _primitiveModeStreamMap[osg::PrimitiveSet::LINES] = &stream[1]; 
    326         _primitiveModeStreamMap[osg::PrimitiveSet::LINE_STRIP] = &stream[2]; 
    327         _primitiveModeStreamMap[osg::PrimitiveSet::LINE_LOOP] = &stream[3]; 
    328         _primitiveModeStreamMap[osg::PrimitiveSet::TRIANGLES] = &stream[4]; 
    329         _primitiveModeStreamMap[osg::PrimitiveSet::TRIANGLE_STRIP] = &stream[5]; 
    330         _primitiveModeStreamMap[osg::PrimitiveSet::TRIANGLE_FAN] = &stream[6]; 
    331         _primitiveModeStreamMap[osg::PrimitiveSet::QUADS] = &stream[7]; 
    332         _primitiveModeStreamMap[osg::PrimitiveSet::QUAD_STRIP] = &stream[8]; 
    333         _primitiveModeStreamMap[osg::PrimitiveSet::POLYGON] = &stream[9]; 
    334345    } 
    335346 
     
    337348    virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable) const 
    338349    { 
     350        if (!_camera) return; 
     351 
    339352        osgText::Text* text = (osgText::Text*)drawable; 
    340353 
     
    348361            viewStr.clear(); 
    349362 
    350             osgUtil::Statistics stats; 
     363            osg::Stats* stats = _camera->getStats(); 
    351364            osgViewer::Renderer* renderer = dynamic_cast<osgViewer::Renderer*>(_camera->getRenderer()); 
    352365             
    353             if (renderer) 
    354             { 
    355                 renderer->getSceneView(0)->getStats(stats); 
    356  
     366            if (stats && renderer) 
     367            { 
    357368                viewStr.setf(std::ios::left,std::ios::adjustfield); 
    358369                viewStr.width(14); 
    359370 
    360371                viewStr << std::setw(1) << _cameraNumber  << ": "; 
     372 
    361373                // Camera name 
    362374                if (_camera->getName().empty()) 
     
    364376                else 
    365377                    viewStr << _camera->getName() << std::endl; 
    366  
    367                 viewStr << std::setw(7) << stats._vertexCount << std::endl; 
    368                 viewStr << std::setw(7) << stats.numDrawables << std::endl; 
    369                 viewStr << std::setw(7) << stats.nlights << std::endl; 
    370                 viewStr << std::setw(7) << stats.nbins << std::endl; 
    371                 viewStr << std::setw(7) << stats.depth << std::endl; 
    372                 viewStr << std::setw(7) << stats.nummat << std::endl; 
    373                 viewStr << std::setw(7) << stats.nimpostor << std::endl; 
    374  
    375                 // Initialize primitive streams  
    376                 PrimitiveModeStreamMap::const_iterator iter; 
    377                 iter = _primitiveModeStreamMap.begin(); 
    378                 for(iter = _primitiveModeStreamMap.begin(); iter != _primitiveModeStreamMap.end(); ++iter) 
     378                     
     379                int frameNumber = renderInfo.getState()->getFrameStamp()->getFrameNumber(); 
     380                if (!(renderer->getGraphicsThreadDoesCull())) 
    379381                { 
    380                     iter->second->str("0"); 
    381                 } 
    382  
    383                 // Write collected primitive values 
    384                 osgUtil::Statistics::PrimitiveCountMap::iterator primitiveItr; 
    385                 for(primitiveItr  = stats.GetPrimitivesBegin(); primitiveItr != stats.GetPrimitivesEnd(); ++primitiveItr) 
    386                 { 
    387                     PrimitiveModeStreamMap::const_iterator strItr = _primitiveModeStreamMap.find((*primitiveItr).first); 
    388                     if (strItr != _primitiveModeStreamMap.end()) 
    389                     { 
    390                         *(strItr->second) <<  (*primitiveItr).second; 
    391                     } 
     382                    --frameNumber; 
    392383                } 
    393384                 
    394                 // Concatenate all streams 
    395                 for(iter = _primitiveModeStreamMap.begin(); iter != _primitiveModeStreamMap.end(); ++iter) 
    396                 { 
    397                     viewStr << iter->second->str() << std::endl; 
    398                 } 
     385                #define STATS_ATTRIBUTE(str) \ 
     386                    if (stats->getAttribute(frameNumber, str, value)) \ 
     387                        viewStr << std::setw(7) << value << std::endl; \ 
     388                    else \ 
     389                        viewStr << std::setw(7) << "no value" << std::endl; \ 
     390 
     391                double value = 0.0; 
     392 
     393                STATS_ATTRIBUTE("Visible vertex count") 
     394                STATS_ATTRIBUTE("Visible number of drawables") 
     395                STATS_ATTRIBUTE("Visible number of lights") 
     396                STATS_ATTRIBUTE("Visible number of render bins") 
     397                STATS_ATTRIBUTE("Visible depth") 
     398                STATS_ATTRIBUTE("Visible number of materials") 
     399                STATS_ATTRIBUTE("Visible number of impostors") 
     400 
     401                STATS_ATTRIBUTE("Visible number of GL_POINTS") 
     402                STATS_ATTRIBUTE("Visible number of GL_LINES") 
     403                STATS_ATTRIBUTE("Visible number of GL_LINE_STRIP") 
     404                STATS_ATTRIBUTE("Visible number of GL_LINE_LOOP") 
     405                STATS_ATTRIBUTE("Visible number of GL_TRIANGLES") 
     406                STATS_ATTRIBUTE("Visible number of GL_TRIANGLE_STRIP") 
     407                STATS_ATTRIBUTE("Visible number of GL_TRIANGLE_FAN") 
     408                STATS_ATTRIBUTE("Visible number of GL_QUADS") 
     409                STATS_ATTRIBUTE("Visible number of GL_QUAD_STRIP") 
     410                STATS_ATTRIBUTE("Visible number of GL_POLYGON") 
     411 
    399412 
    400413                text->setText(viewStr.str()); 
     
    404417    } 
    405418 
    406     std::ostringstream stream[10]; 
    407     typedef std::map<GLenum, std::ostringstream*> PrimitiveModeStreamMap; 
    408     PrimitiveModeStreamMap        _primitiveModeStreamMap; 
    409     osg::ref_ptr<osg::Camera>    _camera; 
    410     mutable osg::Timer_t        _tickLastUpdated; 
    411     int                            _cameraNumber; 
     419    osg::observer_ptr<osg::Camera>  _camera; 
     420    mutable osg::Timer_t            _tickLastUpdated; 
     421    int                             _cameraNumber; 
    412422}; 
    413423 
     
    425435    virtual void drawImplementation(osg::RenderInfo& renderInfo,const osg::Drawable* drawable) const 
    426436    { 
     437        if (!_view) return; 
     438 
    427439        osgText::Text* text = (osgText::Text*)drawable; 
    428440 
     
    433445        { 
    434446            _tickLastUpdated = tick; 
    435             osg::ref_ptr<osg::Node> sceneRoot = _view ? _view->getScene()->getSceneData() : 0; 
     447            osg::ref_ptr<osg::Node> sceneRoot = _view.valid() ? _view->getScene()->getSceneData() : 0; 
    436448 
    437449            if (sceneRoot.valid()) 
     
    494506    } 
    495507 
    496     // Using a ref_ptr causes a crash during cleanup 
    497     //osg::ref_ptr<osgViewer::View>     _view; 
    498     osgViewer::View*        _view; 
    499     mutable osg::Timer_t    _tickLastUpdated; 
    500     int                        _viewNumber; 
     508    osg::observer_ptr<osgViewer::View>  _view; 
     509    mutable osg::Timer_t                _tickLastUpdated; 
     510    int                                 _viewNumber; 
    501511}; 
    502512 
     
    13931403        viewStr << "Line loops" << std::endl; 
    13941404        viewStr << "Triangles" << std::endl; 
    1395         viewStr << "Triangle strips" << std::endl; 
    1396         viewStr << "Triangle fans" << std::endl; 
     1405        viewStr << "Tri. strips" << std::endl; 
     1406        viewStr << "Tri. fans" << std::endl; 
    13971407        viewStr << "Quads" << std::endl; 
    13981408        viewStr << "Quad strips" << std::endl;