OSG控制帧率的方法
2016-06-02 09:53
405 查看
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::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
相关文章推荐
- iOS应用性能调优的25个建议和技巧
- iOS学习笔记06—Category和Extension
- awk实战——分组统计(允许字符下标)
- Servlet监听器/Session钝化和活化
- mysql 常用命令大全
- [Effective JavaScript 笔记]第23条:永远不要修改arguments对象
- mongodb常见问题
- JS从一组数据中找到指定的单条数据的方法
- 大型网站架构演化发展历程
- Solr中配置文件schema.xml之copyField 与multiValued用途
- 压缩图片尺寸
- Jms消费者模式
- 又见中文乱码
- 【数据表间关联关系】 一对多、多对一、一对一、多对多
- 【Redis源码剖析】 - Redis持久化之RDB
- leetcode #79 in cpp
- DBCP 配置
- Solr4.4入门,介绍Solr的安装、IK分词器的配置及高亮查询结果(一)
- android之蓝牙控制小四轴飞行器
- Vijos P1297 生日蛋糕 NOI1999