Show
Ignore:
Timestamp:
05/26/08 16:30:48 (7 years ago)
Author:
robert
Message:

Added better stats reporting

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgscreencapture/osgscreencapture.cpp

    r8343 r8344  
    6464                _height(0), 
    6565                _currentImageIndex(0), 
    66                 _currentPboIndex(0) 
    67             { 
     66                _currentPboIndex(0), 
     67                _reportTimingFrequency(100), 
     68                _numTimeValuesRecorded(0), 
     69                _timeForReadPixels(0.0), 
     70                _timeForFullCopy(0.0), 
     71                _timeForMemCpy(0.0) 
     72 
     73            { 
     74                _previousFrameTick = osg::Timer::instance()->tick(); 
     75 
    6876                if (gc->getTraits()) 
    6977                { 
     
    122130            } 
    123131             
     132            void updateTimings(osg::Timer_t tick_start, 
     133                               osg::Timer_t tick_afterReadPixels, 
     134                               osg::Timer_t tick_afterMemCpy, 
     135                               unsigned int dataSize); 
     136 
    124137            void read() 
    125138            { 
     
    167180            unsigned int            _currentPboIndex; 
    168181            PBOBuffer               _pboBuffer; 
     182 
     183            unsigned int            _reportTimingFrequency; 
     184            unsigned int            _numTimeValuesRecorded; 
     185            double                  _timeForReadPixels; 
     186            double                  _timeForFullCopy; 
     187            double                  _timeForMemCpy; 
     188            osg::Timer_t            _previousFrameTick; 
    169189        }; 
    170190     
     
    211231        mutable ContextDataMap      _contextDataMap; 
    212232         
     233         
    213234}; 
     235 
     236void WindowCaptureCallback::ContextData::updateTimings(osg::Timer_t tick_start, 
     237                                                       osg::Timer_t tick_afterReadPixels, 
     238                                                       osg::Timer_t tick_afterMemCpy, 
     239                                                       unsigned int dataSize) 
     240{ 
     241    if (!_reportTimingFrequency) return; 
     242 
     243    double timeForReadPixels = osg::Timer::instance()->delta_s(tick_start, tick_afterReadPixels); 
     244    double timeForFullCopy = osg::Timer::instance()->delta_s(tick_start, tick_afterMemCpy); 
     245    double timeForMemCpy = osg::Timer::instance()->delta_s(tick_afterReadPixels, tick_afterMemCpy); 
     246 
     247    _timeForReadPixels += timeForReadPixels; 
     248    _timeForFullCopy += timeForFullCopy; 
     249    _timeForMemCpy += timeForMemCpy; 
     250     
     251    _previousFrameTick = tick_afterMemCpy; 
     252     
     253    ++_numTimeValuesRecorded; 
     254     
     255    if (_numTimeValuesRecorded==_reportTimingFrequency) 
     256    { 
     257        timeForReadPixels = _timeForReadPixels/double(_numTimeValuesRecorded); 
     258        timeForFullCopy = _timeForFullCopy/double(_numTimeValuesRecorded); 
     259        timeForMemCpy = _timeForMemCpy/double(_numTimeValuesRecorded); 
     260     
     261        _timeForReadPixels = 0.0; 
     262        _timeForFullCopy = 0.0; 
     263        _timeForMemCpy = 0.0; 
     264 
     265        _numTimeValuesRecorded = 0; 
     266 
     267        double numMPixels = double(_width * _height) / 1000000.0; 
     268        double numMb = double(dataSize) / (1024*1024); 
     269 
     270        if (timeForMemCpy==0.0) 
     271        { 
     272            osg::notify(osg::NOTICE)<<"Full frame copy = "<<timeForFullCopy*1000.0f<<"ms rate = "<<numMPixels / timeForFullCopy<<" Mpixel/sec, copy speed = "<<numMb / timeForFullCopy<<" Mb/sec"<<std::endl; 
     273        } 
     274        else 
     275        { 
     276            osg::notify(osg::NOTICE)<<"Full frame copy = "<<timeForFullCopy*1000.0f<<"ms rate = "<<numMPixels / timeForFullCopy<<" Mpixel/sec, "<<numMb / timeForFullCopy<< " Mb/sec "<< 
     277                                      "time for memcpy = "<<timeForMemCpy*1000.0<<"ms  memcpy speed = "<<numMb / timeForMemCpy<<" Mb/sec"<<std::endl; 
     278        } 
     279 
     280    } 
     281 
     282} 
    214283 
    215284void WindowCaptureCallback::ContextData::readPixels() 
     
    230299 
    231300    osg::Image* image = _imageBuffer[_currentImageIndex].get(); 
     301 
     302    osg::Timer_t tick_start = osg::Timer::instance()->tick(); 
    232303 
    233304#if 1 
     
    236307#endif 
    237308 
     309    osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); 
     310 
     311    updateTimings(tick_start, tick_afterReadPixels, tick_afterReadPixels, image->getTotalSizeInBytes()); 
     312 
    238313    if (!_fileName.empty()) 
    239314    { 
     
    291366    } 
    292367 
     368    osg::Timer_t tick_start = osg::Timer::instance()->tick(); 
     369 
    293370#if 1 
    294371    glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); 
    295372#endif 
    296373 
     374    osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); 
     375 
    297376    GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, 
    298377                                              GL_READ_ONLY_ARB); 
    299  
    300378    if(src) 
    301379    { 
    302380        memcpy(image->data(), src, image->getTotalSizeInBytes()); 
    303  
    304381        ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); 
    305382    } 
    306383 
     384    ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); 
     385 
     386    osg::Timer_t tick_afterMemCpy = osg::Timer::instance()->tick(); 
     387 
     388    updateTimings(tick_start, tick_afterReadPixels, tick_afterMemCpy, image->getTotalSizeInBytes()); 
     389 
    307390    if (!_fileName.empty()) 
    308391    { 
     
    310393    } 
    311394 
    312     ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); 
    313395 
    314396    _currentImageIndex = nextImageIndex; 
     
    379461    } 
    380462 
     463    osg::Timer_t tick_start = osg::Timer::instance()->tick(); 
     464 
    381465#if 1 
    382466    glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); 
    383467#endif 
    384468 
     469    osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); 
     470 
    385471    if (doCopy) 
    386472    { 
     
    390476        GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, 
    391477                                                  GL_READ_ONLY_ARB); 
    392  
    393478        if(src) 
    394479        { 
    395             // memcpy(image->data(), src, image->getTotalSizeInBytes()); 
    396  
     480            memcpy(image->data(), src, image->getTotalSizeInBytes()); 
    397481            ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); 
    398482        } 
     
    405489     
    406490    ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); 
     491 
     492    osg::Timer_t tick_afterMemCpy = osg::Timer::instance()->tick(); 
     493     
     494    updateTimings(tick_start, tick_afterReadPixels, tick_afterMemCpy, image->getTotalSizeInBytes()); 
    407495 
    408496    _currentImageIndex = nextImageIndex;