OSG控制帧率的方法

转载 2016年06月02日 09:53:26

 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;
    float start_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(new PrintName);
 viewer->addEventHandler(new osgViewer::HelpHandler);
 viewer->addEventHandler(new osgViewer::StatsHandler);
 viewer->addEventHandler(new osgViewer::WindowSizeHandler);
 viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);
 viewer->setSceneData(node);

 viewer->setCameraManipulator(new osgGA::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;     
  }

转载地址:http://blog.sina.com.cn/s/blog_48ed03c801018blt.html

OSG多线程,多显示场景图形设计

参考路径http://www.cnblogs.com/mazhenyu/archive/2013/01/25/2876738.html 多线程,多显示场景图形设计: 一种新的过程模型 关于...
  • wang15061955806
  • wang15061955806
  • 2016年01月07日 16:58
  • 2178

OSG OpenThreads 线程学习(1)

这些天,经过对OSG OpenThreads代码的学习,在
  • wuganghui
  • wuganghui
  • 2014年09月10日 15:01
  • 1460

OpenThreads库的使用-Thread

Thread简介OpenThread库,提供了一个Thread类,供用户创建自己的线程。其使用非常方便,用户只需要继承自OpenThreads::Thread类,然后自己重写run接口即可。Threa...
  • snail_hunan
  • snail_hunan
  • 2017年04月09日 08:04
  • 1134

19、osg中控制帧速实例

// Example1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include #in...
  • sunxiaoju
  • sunxiaoju
  • 2015年12月27日 21:28
  • 1186

OSG中与时间相关的类osg::FrameStamp,osg::Timer源码剖析

这次分析一下OSG中的的
  • u012501459
  • u012501459
  • 2014年09月17日 16:42
  • 1788

OSG教程:场景保存类Viewer

来源:第三维度     作者:FreeSouth[杨石兴]编著     选自《OSG程序设计教程》第二章第四节     osgViewer::Viewer     类描述: 为一个单独的场景[...
  • TimothyFly
  • TimothyFly
  • 2012年08月08日 11:04
  • 4731

osg::FrameStamp

   继承关系如下: Public Member Functions ...
  • zhuqinglu
  • zhuqinglu
  • 2007年10月16日 14:24
  • 1916

OSG学习笔记5—使用开关节点

// osg_4_23.cpp : 定义控制台应用程序的入口点。 //使用开关节点 //开关节点的用法,以及使用开关节点的更新回调完成了动态的子节点切换过程。  //一共切换两次,一次在120帧...
  • u011310341
  • u011310341
  • 2016年04月23日 16:08
  • 889

第7课时《osg交互》

1.交互      所谓交互,一般指的的我们的键盘、鼠标等响应。OSG针对场景的操作封装了一系列的用于交互的事件处理器。      在osgViewer中存在,addEventHandler方法,...
  • u013207966
  • u013207966
  • 2016年05月31日 16:48
  • 733

OSG视景器四种线程模型(摘自Array《最长的一帧》)

OSG 的视景器包括四种线程模型,可以使用setThreadingModel 进行设置,不同的线程 模型在仿真循环运行时将表现出不同的渲染效率和线程控制特性。通常而言,这四种线程的 特性如下: ...
  • sdauzxl
  • sdauzxl
  • 2015年08月02日 10:32
  • 1527
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSG控制帧率的方法
举报原因:
原因补充:

(最多只允许输入30个字)