#include <Windows.h>
#ifdef _DEBUG
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"osgViewerd.lib")
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"OpenThreadsd.lib")
#pragma comment(lib,"osgUtild.lib")
#pragma comment(lib,"osgGAd.lib")
#pragma comment(lib,"osgTextd.lib")
#else
#pragma comment(lib,"osgDB.lib")
#pragma comment(lib,"osgViewer.lib")
#pragma comment(lib,"osg.lib")
#pragma comment(lib,"OpenThreads.lib")
#pragma comment(lib,"osgUtil.lib")
#pragma comment(lib,"osgGA.lib")
#pragma comment(lib,"osgText.lib")
#endif
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include<osgGA/GUIEventAdapter>
#include<osgViewer/ViewerEventHandlers>
#include<osgGA/TrackballManipulator>
#include<string>
#include<iostream>
using namespace std;
class PrintName :public osgGA::GUIEventHandler
{
public:
bool handle(const osgGA::GUIEventAdapter&ea, osgGA::GUIActionAdapter&aa)
{
return false;
}
virtual void getUsage(osg::ApplicationUsage&usage)const
{
usage.addKeyboardMouseBinding(("world"), "Hello");
}
};
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer;
//申请一个定时器
osg::Timer *timer = new osg::Timer;
osg::Timer_t start_frametime = 0;
osg::Timer_t end_frametime = 0;
float vstart_time = 0.0;
float vend_time = 0.0;
//控制帧速使用的睡眠时间
float sleep_time = 0.0;
float last_sleep = 0.0001;
//每帧控制法
float per_statime = 0.0;
float per_endtime = 0.0;
//计算帧速
int counts = 0;
//得到一个tick值为多少second
cout << timer->getSecondsPerTick() << endl;
//start_time = timer->tick();
timer->setStartTick();
vstart_time = viewer->elapsedTime();
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("glider.osg");
cout << "读取时间为" << timer->time_s() << endl;
vend_time = viewer->elapsedTime();
//end_time = timer->tick();
cout << "读取模型的时间为" << vend_time - vstart_time << endl;;
if (!node.get())
{
cout << "open file is failed!" << endl;
return -1;
}
//添加帮助事件
viewer->addEventHandler(new osgViewer::HelpHandler);
viewer->addEventHandler(new PrintName);
viewer->addEventHandler(new osgViewer::StatsHandler);
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);
viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);
viewer->setSceneData(node);
viewer->realize();
//加操作器
viewer->setCameraManipulator(new osgGA::TrackballManipulator());
//return viewer->run();
while (!viewer->done())
{
per_statime = timer->tick();
if (counts == 0)
{
start_frametime = timer->tick();
}
counts++;
viewer->frame();
per_endtime = timer->tick();
sleep_time=1.0/35.0 - (timer->delta_s(per_statime, per_endtime));
if (sleep_time < 0)
{
sleep_time = last_sleep * 0.8;
}
last_sleep = sleep_time;
OpenThreads::Thread::microSleep(sleep_time * 1000000);
if (counts == 3)
{
//限制帧速为10
counts = 0;
end_frametime = timer->tick();
cout << "当前帧速为:" <<3/(timer->delta_s(start_frametime, end_frametime)) << endl;
//得到睡眠时间
/*sleep_time = 0.1 - (timer->delta_s(start_frametime, end_frametime)) / 3;
if (sleep_time < 0)
{
sleep_time = last_sleep*0.8;
last_sleep = sleep_time;
}*/
}
}
return 0;
}