第一日学习(一)osgViewer/ViewerBase.cpp( ViewerBase::frame())



void ViewerBase::frame(double simulationTime)
{
    if (_done) return;

    // OSG_NOTICE<<std::endl<<"CompositeViewer::frame()"<<std::endl<<std::endl;

    if (_firstFrame)
    {

//、如果这是仿真系统启动后的第一帧,则执行 viewerInit();此时如果还没有执行 realize() 函数,则执行它。 
        viewerInit();

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

        _firstFrame = false;
    }

//执行 advance 函数
    advance(simulationTime);

//执行 eventTraversal 函数,顾名思义,这个函数将负责处理系统产生的各种事件,诸 如鼠标的移动,点击,键盘的响应,窗口的关闭等等,以及摄像机与场景图形的事件回调 (EventCallback)。

    eventTraversal();

//执行 updateTraversal 函数,这个函数负责遍历所有的更新回调(UpdateCallback); 除此之外,它的另一个重要任务就是负责更新 DatabasePager 与 ImagePager 这两个重要的分 页数据处理组件。 
    updateTraversal();

//执行 renderingTraversals 函数,这里将使用较为复杂的线程处理方法,完成场景的筛 选(cull)和绘制(draw)工作。
    renderingTraversals();
}

 

 

下面写写学习体会。

这个流程是把初始化写在了每一帧中,用了bool变量避免重复初始化。然后推进时间,再加入输入和摄像机回调。再进行数据更新处理,最后多线程渲染。

 

基本上和gis引擎整合的流程一样。

 

在更新数据上,用了DatabasePager 与 ImagePager,应该更专业,这是初步体会,但是还没有看源码,所以说不出一二三来。

 

另外,这个时间推进是干啥的?根据<<windows游戏编程大师技巧>>中,输入应该是每帧的开始。也放在问号区。

 

总结下:

需要关注的函数:

frame()

{

viewerInit();

isRealized();

realize();

advance(simulationTime);

eventTraversal();

updateTraversal();

renderingTraversals();

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值