最长的一帧
王锐(array)
这是一篇有关 OpenSceneGraph 源代码的拙劣教程,没有任何能赏心悦目的小例子,也
不会贡献出什么企业级的绝密的商业代码,标题也只是个噱头(坏了,没人看了^_^)。
本文写作的目的说来很简单,无非就是想要深入地了解一下,OSG 在一帧时间,也就
是仿真循环的一个画面当中都做了什么。
对 OSG 有所了解之后,我们也许可以很快地回答这个问题,正如下面的代码所示:
while (!viewer.done())
viewer.frame();
就这样,用一个循环结构来反复地执行 frame()函数,直到 done()函数的返回值为 true
为止。每一次执行 frame()函数就相当于完成了 OSG 场景渲染的一帧,配置较好的计算机可
以达到每秒钟一二百帧的速率,而通常仿真程序顺利运行的最低帧速在 15~25 帧/秒即可。
很好,看来笔者的机器运行 frame()函数通常只需要 8~10ms 左右,比一眨眼的工夫都要
短。那么本文就到此结束吗?
答案当然是否定的,恰恰相反,这篇繁琐且可能错误百出的文字,其目的正是要深入
frame()函数,再深入函数中调用的函数……一直挖掘下去,直到我们期待的瑰宝出现;当然
也可能是一无所获,只是乐在其中。
这样的探索要到什么时候结束呢?从这短短的 10 毫秒中引申出来的,无比冗长的一帧,
又是多么丰富抑或无聊的内容呢?现在笔者也不知道,也许直到最后也不会明了,不过相信
深入源代码的过程就是一种享受,希望读者您也可以同我一起享受这份辛苦与快乐。
源代码版本:OpenSceneGraph 2.6.0;操作系统环境假设为 Win32 平台。为了保证教程
的篇幅不致被过多程序代码所占据,文中会适当地改写和缩编所列出的代码,仅保证其执行
效果不变,因此可能与实际源文件的内容有所区别。
由于作者水平和精力所限,本文暂时仅对单视景器(即使用 osgViewer::Viewer 类)的
情形作出介绍。
转载请注明作者和 www.osgchina.org
本文在写作过程中将会用到一些专有名词,它们可能与读者阅读的其它文章中所述有所
差异,现列举如下:
场景图形-SceneGraph;场景子树-Subgraph;节点-Node;摄像机-Camera;渲染器-Renderer;
窗口-Window;视口-Viewport;场景-Scene;视图-View;视景器-Viewer;
漫游器-Manipulator;
访问器-Visitor;回调-Callback;事件-Event;更新-Update;筛选-Cull;绘制-Draw。
第一日
好了,在开始第一天的行程之前,请先打开您最惯用的编程工具吧:VisualStudio?
CodeBlocks?UltraEdit?SourceInsight?Emacs?Vim?或者只是附件里那个制作低劣的记事
本……总之请打开它们,打开 OpenSceneGraph-2.6.0 的源代码文件夹,打开
评论1