osg视频基础教程 - 第3讲 应用基础(下) timer ElapsedTime Viewer::Run

前言

视频连接

一 osg::Timer

1. osgTimer定义 使用

  1. 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();
}

解释:

  1. 加载TrackBall 操作器
    setCameraManipulator(new osgGA::TrackballManipulator());

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

解释

  1. realize()
    if (!isRealized())
    {
    realize();
    }

  2. 显示总帧数 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;
	}
  1. 这是TrackBallManipulator
    viewer->setCameraManipulator(new osgGA::TrackballManipulator());
  2. 绘制循环
    while(!viewer->done())
    {
    elapsed->reset();
    viewer->frame();
    std::cout<< "frame ( fps ) = "<< 1.0/elapsed->elapsedTime() <<std::endl;
    }
  3. 帧素
    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

  1. 记录使用TrackballManipulator所旋转的路径
  2. 小写 z 记录 大写Z重复
osg::ref_ptr<osgViewer::RecordCameraPathHandler> handler5 =  new osgViewer::RecordCameraPathHandler();
viewer->addEventHandler(handler5);
  1. 路径文件自动保存
    saved_animation.path
  2. 使用osgviewer 测试路径 -p 选项
d:\osg-data\ : osgviewer cow.osg -p   saved_animation.path
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值