void HeartBeat::timerEvent( QTimerEvent */*event*/ ) { osg::ref_ptr< osgViewer::ViewerBase > viewer; if( !_viewer.lock( viewer ) ) { // viewer has been deleted -> stop timer stopTimer(); return; } // limit the frame rate if( viewer->getRunMaxFrameRate() > 0.0) { double dt = _lastFrameStartTime.time_s(); double minFrameTime = 1.0 / viewer->getRunMaxFrameRate(); if (dt < minFrameTime) OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(minFrameTime-dt))); } else { // avoid excessive CPU loading when no frame is required in ON_DEMAND mode if( viewer->getRunFrameScheme() == osgViewer::ViewerBase::ON_DEMAND ) { double dt = _lastFrameStartTime.time_s(); if (dt < 0.01) OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(0.01-dt))); } // record start frame time _lastFrameStartTime.setStartTick(); // make frame if( viewer->getRunFrameScheme() == osgViewer::ViewerBase::ON_DEMAND ) { if( viewer->checkNeedToDoFrame() ) { viewer->frame(); } } else { viewer->frame(); } } }