调着比较上瘾了。没第三天那么费劲了。
先看总体

依然在realize()里面,不过第五天就要把这个解决了。
继续跟过去,遍历所有图形上下文设备,对于每个图像上下文指针gc,判断是否为图形窗口类,负责把鼠标焦点转到当前窗口



启动OSG内部定时器并开始计时




找到当前视景器和所有的图形上下文设备的事件队列_eventQuue,并设定它们的启动时刻为当前时间




下面是关键,设置线程模型

电子书上介绍了四种线程模型。

1,SingleThreaded: 单线程,任何配置下可以使用,osg不会创建任何新线程来完成场景的筛选和渲染 (配置低)
2,CullDrawThreadPerContext:为每个图形上下文创建一个图形线程并行渲染+分配到多CPU(如果有)+每帧结束前强制同步所有线程 (应用范围有限)
3,DrawThreadPerContext:为每个图形上下文创建一个图形线程并行渲染+分配到多CPU(如果有)+在当前帧所有线程完成前开始下一帧
4,CullThreadPerCameraDrawThreadPerContext:为每个图形上下文和每个摄像机创建图形线程并行渲染+分配到多CPU(如果有)+在当前帧所有线程完成前开始下一帧(最优)
电子书上介绍了单线程多处理器系统

![]()

先设置下线程模型为单线程,
![]()
好了,OK了

如果线程运行,则停止线程,因为这里是初始化,还在realize()
这里根据cpu的亲缘性,cpu0处理用户更新、筛选和渲染等一切事务,而使用cpu1来处理场景的两个分页数据库(DatabasePager)线程(分别用于处理本地和网络的场景数据)

我的是8核的,五年前的老机子






thread=NULL,因为局部存储区还没存东西。


获取当前视景区的场景,含图形根节点,分页数据库和分页图像库 。viewer单场景,compositer可能包含多场景








![]()
![]()




















再熟悉了下各个类,
拉回来,以上是ViewerBase::setUpThreading()在单线程的情况,再看看多线程的情况,进入else

由于后面电子书上有,所以,只粗略看下,暂时不展开


继续往下走,到了realize()的尾声

将注释去掉,启用编译上下文









![]()





这里不做扩展了,因为不是主要流程。也说了会崩溃,
实际上,已经崩溃了

pbuffer有问题,所以就不从这里调试了。

第五天的内容就要结束了,

3万+

被折叠的 条评论
为什么被折叠?



