- Timestamp:
- 05/26/08 16:30:48 (5 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/examples/osgscreencapture/osgscreencapture.cpp
r8343 r8344 64 64 _height(0), 65 65 _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 68 76 if (gc->getTraits()) 69 77 { … … 122 130 } 123 131 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 124 137 void read() 125 138 { … … 167 180 unsigned int _currentPboIndex; 168 181 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; 169 189 }; 170 190 … … 211 231 mutable ContextDataMap _contextDataMap; 212 232 233 213 234 }; 235 236 void 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 } 214 283 215 284 void WindowCaptureCallback::ContextData::readPixels() … … 230 299 231 300 osg::Image* image = _imageBuffer[_currentImageIndex].get(); 301 302 osg::Timer_t tick_start = osg::Timer::instance()->tick(); 232 303 233 304 #if 1 … … 236 307 #endif 237 308 309 osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); 310 311 updateTimings(tick_start, tick_afterReadPixels, tick_afterReadPixels, image->getTotalSizeInBytes()); 312 238 313 if (!_fileName.empty()) 239 314 { … … 291 366 } 292 367 368 osg::Timer_t tick_start = osg::Timer::instance()->tick(); 369 293 370 #if 1 294 371 glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); 295 372 #endif 296 373 374 osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); 375 297 376 GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, 298 377 GL_READ_ONLY_ARB); 299 300 378 if(src) 301 379 { 302 380 memcpy(image->data(), src, image->getTotalSizeInBytes()); 303 304 381 ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); 305 382 } 306 383 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 307 390 if (!_fileName.empty()) 308 391 { … … 310 393 } 311 394 312 ext->glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);313 395 314 396 _currentImageIndex = nextImageIndex; … … 379 461 } 380 462 463 osg::Timer_t tick_start = osg::Timer::instance()->tick(); 464 381 465 #if 1 382 466 glReadPixels(0, 0, _width, _height, _pixelFormat, _type, 0); 383 467 #endif 384 468 469 osg::Timer_t tick_afterReadPixels = osg::Timer::instance()->tick(); 470 385 471 if (doCopy) 386 472 { … … 390 476 GLubyte* src = (GLubyte*)ext->glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, 391 477 GL_READ_ONLY_ARB); 392 393 478 if(src) 394 479 { 395 // memcpy(image->data(), src, image->getTotalSizeInBytes()); 396 480 memcpy(image->data(), src, image->getTotalSizeInBytes()); 397 481 ext->glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); 398 482 } … … 405 489 406 490 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()); 407 495 408 496 _currentImageIndex = nextImageIndex;
