设置线程模型的依据--ViewerBase::suggestBestThreadingModel()

这个函数困扰了很久,
四个线程模型
SingleThreaded,CullDrawThreadPerContext ,DrawThreadPerContext,CullThreadPerCameraDrawThreadPerContext
到底是如何判断的。依据是什么?

我谈谈个人理解,不一定对。

首先说下,摄像机在这里指代什么?context指代什么?
我一开始以为摄像机是大屏,哈哈。

这几个线程模型的用在renderingTraversals(); 场景的渲染遍历工作阶段。

这个阶段两个重要工作
1,剔除
2,渲染。

因此,
这里的摄像机,实际上就是剔除阶段的摄像机坐标系cull,
这里的context就是渲染阶段。makecurrent()就是opengl和各种窗口结合,比如mfc,qt,或者windows api。

那么,能不能分别独立的剔除和渲染呢?这是肯定的。在《最长的一帧》中写的很清楚
在这里插入图片描述
文中的图形设备实际上就是线程模型中的camera+context

理解了这点,剩下的就好理解了。

如果环境变量指定了,这个没的说,让干啥就干啥
在这里插入图片描述
如果极端情况,没有摄像机或者图形设备,就是单线程,环境太恶劣了就用单线程。

在这里插入图片描述
对于正常情况,
在这里插入图片描述
到这里似乎就完了。
深入地思考下。

不管单窗口或者多窗口,有个什么特点呢?
context是用来渲染的,context是用来渲染的,context是用来渲染的。重要的事情说三遍。
那就是,只要处理器个数大于context的个数,都会多线程渲染,也就是包含"DrawThreadPerContext"字样。
如果土豪的话,系统cpu个数非常多,那么筛选阶段也可以用多线程,即CullThreadPerCameraDrawThreadPerContext =CullThreadPerCamera + DrawThreadPerContext

结论是,
如果情况太恶劣,就用单线程模型;
但凡情况好一点,就用多线程渲染;
情况再土豪,就把剔除也用多线程。

而往往是单窗口多核,即DrawThreadPerContext。这是最常见的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值