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;
}