这个函数困扰了很久,
四个线程模型
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。这是最常见的。