#include<iostream>#include<Windows.h>#include"osgViewer/Viewer"//视图管理#include"osgDB/ReadFile"//osgDB用来模型的读写#include"osgGA/GUIEventAdapter"//osgGA主要是管理事件,也可以控制操作器,他是操作器的一个大虚类,管理外设#include<osgViewer/ViewerEventHandlers>#include<osgGA/TrackballManipulator>//模拟一个事件类,响应单击hint main(){ osg::ref_ptr<osgViewer::Viewer>viewer = new osgViewer::Viewer; osg::ref_ptr<osg::Node> node = new osg::Node; //申请一个定时器类 osg::Timer*timer = new osg::Timer;//timer不支持超级指针 //得到一个tick值为多少second(值很小) std::cout << timer->getSecondsPerTick() << std::endl; osg::Timer_t start_frame_time = 0;//开始时间 osg::Timer_t end_frame_timer = 0;//结束时间 //控制帧速使用的睡眠时间 float sleep_time = 0.0; float last_sleep = 0.000001; //每帧控制法 float per_str_time = 0.0;//一帧的开始时间 float per_end_time = 0.0;//一帧的结束时间 //计算帧速 int counts = 0; //读取模型 node = osgDB::readNodeFile("glider.osg"); viewer->setSceneData(node.get()); //加操作器 viewer->setCameraManipulator(new osgGA::TrackballManipulator()); //return viewer->run();//显示信息文字是时候是在这个时候 while (!viewer->done())//加了操作器才能使用done控制viewer { per_str_time = timer->tick();//将当前的tick值赋值给一帧开始的时间 if (counts == 0) { start_frame_time = timer->tick();//将当前的tick值赋值给为了计算帧速的开始时间 } counts++;//计数器+1 viewer->frame(); per_end_time = timer->tick();//一帧结束,将当前的tick值赋值给一帧的结束时间 sleep_time = 1.0 / 35.0 - (timer->delta_s(per_str_time, per_end_time));//为了把帧速控制到35,将需要sleep的时间算出来 if (sleep_time<0) { //当sleep小于0的时候,也就是不需要sleep时,也让程序小睡一会,睡个八分饱,为了解决帧速猛增的问题 sleep_time = last_sleep*0.8; } last_sleep = sleep_time; OpenThreads::Thread::microSleep(sleep_time * 1000000);//microSleep方法的参数为百万分之一秒,所以一百万为1s if (counts == 3)//三帧一计算,可以使数据更稳定 { //到了三帧,counts置为0,获取当前的tick值给结束时间 counts = 0; end_frame_timer = timer->tick(); std::cout << "当前帧速为: " << 3 / (timer->delta_s(start_frame_time, end_frame_timer)) << std::endl;//计算 } } return 0;}这只是在学识OSG入门的一个开端,写的不好,但希望有用。
新闻热点
疑难解答