我们继续回到osgViewer::ViewerBase::startThreading()函数中,继续向下探究。
下一步就是要遍历所有的GraphicContexts,为每个context创建单独的线程。因为除了singleThread其余的三种ThreadMode(CullDrawThreadPerContext, DrawThreadPerContext, CullThreadPerCameraDrawThreadPerContext)都有为每个Context分配一个单独的线程。
1、指定这个gc的动态物体绘制完成的callback函数。
2、gc->createGraphicsThread();创建单独的图形线程为这个Context。
3、把创建好的线程随机分配到一个cpu上。
4、当threadMode为CullDrawThreadPerContext时,指定这个图形线程的开始渲染栅栏
5、根据指定的swapReadyBarrier( 任务的作用是在交换双缓存之前对所有 GC 线程执行一次同步)的位置,来指定这个图形线程的结束栅栏。
那我们就来探究一下图形设备线程的创建以及工作流程。
gc->createGraphicsThread();
GraphicsContext::createGraphicsThread函数就会发现其实很简单就是创建一个线程对象,然后绑定到这个context上。
当我们使用 GraphicsContext::createGraphicsThread 创建线程时,得到的是一个 osg::GraphicsThread 线程对象(这个与我们下一步要研究的使用 Camera::createCameraThread 创建线程osg::OperationThread 对象不相同,但是osg::Oper