目录
前言
一 osg::Timer
1. osgTimer定义 使用
- tick
概念: 就是一个滴答
转"秒": Timer::getSecondsPerTick() 将tick转换为秒 秒/tick
std::shared_ptr<osg::Timer> timer(new osg::Timer) ;
osg::Timer_t starttime = timer->getStartTick();
//XXX 多种操作
osg::Timer_t endtime = timer->tick();
2. osg::ElapsedTime
std::shared_ptr elapsed(new ElapsedTime);
elapsed->reset();
elapsed->elapsedTime()
二 Viewer::Run()
1. 拆解Viewer::run() - TrackBallManipulator
int Viewer::run()
{
if (!getCameraManipulator() && getCamera()->getAllowEventFocus())
{
setCameraManipulator(new osgGA::TrackballManipulator());
}
setReleaseContextAtEndOfFrameHint(false);
return ViewerBase::run();
}
解释:
-
加载TrackBall 操作器
setCameraManipulator(new osgGA::TrackballManipulator()); -
ViewerBase::run()
2. 拆解ViewerBase::run() - frame() - 绘制
int ViewerBase::run()
{
if (!isRealized())
{
realize();
}
const char* run_frame_count_str = getenv("OSG_RUN_FRAME_COUNT");
unsigned int runTillFrameNumber = run_frame_count_str==0 ? osg::UNINITIALIZED_FRAME_NUMBER : atoi(run_frame_count_str);
while(!done() && (run_frame_count_str==0 || getViewerFrameStamp()->getFrameNumber()<runTillFrameNumber))
{
double minFrameTime = _runMaxFrameRate>0.0 ? 1.0/_runMaxFrameRate : 0.0;
osg::Timer_t startFrameTick = osg::Timer::instance()->tick();
if (_runFrameScheme==ON_DEMAND)
{
if (checkNeedToDoFrame())
{
frame();
}
else
{
// we don't need to render a frame but we don't want to spin the run loop so make sure the minimum
// loop time is 1/100th of second, if not otherwise set, so enabling the frame microSleep below to
// avoid consume excessive CPU resources.
if (minFrameTime==0.0) minFrameTime=0.01;
}
}
else
{
frame();
}
// work out if we need to force a sleep to hold back the frame rate
osg::Timer_t endFrameTick = osg::Timer::instance()->tick();
double frameTime = osg::Timer::instance()->delta_s(startFrameTick, endFrameTick);
if (frameTime < minFrameTime) OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(minFrameTime-frameTime)));
}
return 0;
}
解释
-
realize()
if (!isRealized())
{
realize();
} -
显示总帧数 getenv(“OSG_RUN_FRAME_COUNT”); 得到当前的环境变量
OSG_RUN_FRAME_COUNT 可以在下图中设置, 每秒多少FRAME帧,可以通过StatHandler得到
3. 计算帧数 :替换Viewer::run()函数 viewer::done viewer::frame
//return viewer->run();
viewer->setCameraManipulator(new osgGA::TrackballManipulator());
std::shared_ptr<ElapsedTime> elapsed(new ElapsedTime);
while(!viewer->done())
{
elapsed->reset();
viewer->frame();
std::cout<< "frame ( fps ) = "<< 1.0/elapsed->elapsedTime() <<std::endl;
}
- 这是TrackBallManipulator
viewer->setCameraManipulator(new osgGA::TrackballManipulator()); - 绘制循环
while(!viewer->done())
{
elapsed->reset();
viewer->frame();
std::cout<< "frame ( fps ) = "<< 1.0/elapsed->elapsedTime() <<std::endl;
} - 帧素
std::cout<< "frame ( fps ) = "<< 1.0/elapsed->elapsedTime() <<std::endl;
4. 算一段时间的平均帧数
while(!viewer->done())
{
if (i==0)
{
elapsed->reset();
}
i++;
viewer->frame();
if (i==100)
{
std::cout<< "frame ( fps ) = "<< 100.0/elapsed->elapsedTime() <<std::endl;
i=0;
}
}
三 RecordCameraPathHandler
- 记录使用TrackballManipulator所旋转的路径
- 小写 z 记录 大写Z重复
osg::ref_ptr<osgViewer::RecordCameraPathHandler> handler5 = new osgViewer::RecordCameraPathHandler();
viewer->addEventHandler(handler5);
- 路径文件自动保存
saved_animation.path - 使用osgviewer 测试路径 -p 选项
d:\osg-data\ : osgviewer cow.osg -p saved_animation.path