首页 > 学院 > 开发设计 > 正文

OSG控制帧速的小程序

2019-11-08 20:14:45
字体:
来源:转载
供稿:网友
只要能超过大概35帧就能欺骗人眼,但大多数的设备都大于35帧,60帧是很正常的数值,以下小程序就可以将帧速控制到35帧左右
#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入门的一个开端,写的不好,但希望有用。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表