osg多线程_osgViewer:: Viewer::advance() osg多线程与智能指针

本文详细介绍了osgViewer::Viewer::advance()函数在osg多线程环境中的作用,包括帧管理、时间计算、引用计数及智能指针的使用。同时讨论了osg中删除对象的策略,如DeleteHandler和ref_ptr的权衡,以及在多线程渲染中的潜在问题。最后,简要概述了osg事件遍历(eventTraversal)的基本流程,涉及视景器、摄像机、场景及事件处理器组的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void ViewerBase::frame(doublesimulationTime)

{if (_done) return;//OSG_NOTICE<<:endl>

if(_firstFrame)

{

viewerInit();if (!isRealized())

{

realize();

}

_firstFrame= false;

}

advance(simulationTime);

eventTraversal();

updateTraversal();

renderingTraversals();

}

当前位置:osgViewer/Viewer.cpp 第 643行,osgViewer:: Viewer::advance()

好的,现在我们终于正式进入仿真循环当中了,之前的 realize 函数虽然十分重要,但它实际上是循环运行前的准备工作。而从这一日开始介绍的 advance,eventTraversal,updateTraversal 和 renderingTraversals 函数,才是真正的一帧的组成部分。

advance 函数的工作内容如下:

1、获取上一次记录的参考时间(Reference Time);

2、根据当前时刻,重新记录参考时间,并因此得到两次记录之间的差值,即一帧经历的时间;

3、记录已经经过的帧数;

4、有的时候我们需要将帧速率,参考时间等内容予以记录并显示给用户,此时需要通过 ViewerBase::getStats 函数获得 osg::Stats 对象,用以进行帧状态的保存和显示;

5、如果需要的话,使用 Referenced::getDeleteHandler()来处理 osg::Referenced 对象被弃用之后的删除工作。

仿真循环运行的参考时间,总时间和总帧数都是由 osg::FrameStamp 变量_frameStamp来处理的,如果用户程序需要获取这些信息的话,也可以通过读取这个变量的成员函数来实现。当然,使用 Viewer 中的 osg::Stats 变量_stats 也是可以的,缺省情况下,这个变量会忠实地记录当前帧以及之前的 24 帧的每帧用时,事件遍历用时,更新遍历用时,以及渲染遍历用时信息。如果我们想获得更多的历史数据,抑或对于频繁的记录操作感到厌烦,可以在开始仿真循环之前执行 ViewerBase::setStats 函数,重新设置这个记录器的参数,或者简单地将其置为 NULL。

void Viewer::advance(doublesimulationTime)

{if (_done) return;double previousReferenceTime = _frameStamp->getReferenceTime();

unsignedint previousFrameNumber = _frameStamp->getFrameNumber();

_frameStamp->setFrameNumber(_frameStamp->getFrameNumber()+1);

_frameStamp->setReferenceTime( osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick()) );if (simulationTime==USE_REFERENCE_TIME)

{

_frameStamp->setSimulationTime(_frameStamp->getReferenceTime());

}else{

_frameStamp->setSimulationTime(simulationTime);

}if (getViewerStats() && getViewerStats()->collectStats("frame_rate"))

{//update previous frame stats

double deltaFrameTime = _frameStamp->getReferenceTime() -previousReferenceTime;

getViewerStats()->setAttribute(previousFrameNumber, "Frame duration", deltaFrameTime);

getViewerStats()->setAttribute(previousFrameNumber, "Frame rate", 1.0/deltaFrameTime);//update current frames stats

getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Reference time", _frameStamp->getReferenceTime());

}

//简单说来,它的工作是收集所有已经弃用的 OSG 场景对象,并在需要的时候(例如advance 函数代码的相应部分)执行 os

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值