调试最长的一帧(第五天)
调着比较上瘾了。没第三天那么费劲了。
先看总体
依然在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有问题,所以就不从这里调试了。
第五天的内容就要结束了,
本文地址:https://blog.csdn.net/directx3d_beginner/article/details/111022785
推荐阅读