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