OSG控制帧率的方法

来源:互联网 发布:js 动态加载js 编辑:程序博客网 时间:2024/05/29 17:31

 osg::ref_ptr<osgViewer::Viewer>viewer = new osgViewer::Viewer;
 osg::ref_ptr<osg::Node>node;
   
 //申请一个定时器
 osg::Timer* timer = new osg::Timer;
 osg::Timer_t start_frame_time = 0;
 osg::Timer_t end_frame_time = 0;
    floatstart_time;
 float end_time;
 //控制帧率使用的睡眠时间
 float sleep_time = 0.0;
 float last_sleep_time = 0.0;
 //每帧的实际使用时间
 float current_time = 0.0;
 //每帧控制法
 //float per_start_time = 0.0;
 //float per_end_time = 0.0;
 //计算帧率
 int counts = 0;
 //得到一个tick值为多少second
 std::cout <<timer->getSecondsPerTick()<<std::endl;
    //start_time= timer->tick();
 start_time =viewer->elapsedTime();
 timer->setStartTick();
 node = osgDB::readNodeFile("glider.osg");
 std::cout<<"方法一:读取模型的时间为:"<<timer->time_s()<<std::endl;
 //end_time = timer->tick();
 end_time =viewer->elapsedTime();
 std::cout<<"方法二:读取模型的时间为:"<<end_time- start_time<<std::endl;
 //添加帮助事件
 viewer->addEventHandler(newPrintName);
 viewer->addEventHandler(newosgViewer::HelpHandler);
 viewer->addEventHandler(newosgViewer::StatsHandler);
 viewer->addEventHandler(newosgViewer::WindowSizeHandler);
 viewer->addEventHandler(newosgViewer::ScreenCaptureHandler);
 viewer->setSceneData(node);

 viewer->setCameraManipulator(newosgGA::TrackballManipulator());
 while(!viewer->done())
 {
  //per_start_time =timer->tick();
  if(counts == 0)
  {
   start_frame_time= timer->tick();
  }
  counts++;
  
  viewer->frame();
       //per_end_time = timer->tick();
  //sleep_time=   1/35.0 -timer->delta_s(per_start_time, per_end_time);
  if(sleep_time <0)
  {
   sleep_time =0.0;
  }
  OpenThreads::Thread::microSleep(sleep_time*1000000);
  //last_sleep_time =sleep_time;
  if(counts == 3)
  {
   //限制帧率为35
   counts =0;
   end_frame_time= timer->tick();
   std::cout<<"当前帧速为:" <<3/timer->delta_s(start_frame_time,end_frame_time)<<std::endl;
   
   sleep_time=   sleep_time + 1.0/35.0 -timer->delta_s(start_frame_time,end_frame_time)/3;
   if(sleep_time< 0)
    sleep_time=0;     
  }

0 0
原创粉丝点击