每个渲染器会有两个osgUtil::SceneView,两个是便于在多线程时,一个线程在一个SceneView做裁减,另一个线程在另一个SceneView做绘制,可以并行操作。
osgViewer/Renderer.cpp
Renderer::Renderer(osg::Camera* camera):
osg::Referenced(true),
osg::GraphicsOperation("Renderer",true),
_camera(camera),
_done(false),
_graphicsThreadDoesCull(true),
_compileOnNextDraw(true),
_serializeDraw(false),
_initialized(false),
_startTick(0)
{
_sceneView[0] = new osgUtil::SceneView;
_sceneView[1] = new osgUtil::SceneView;
_availableQueue.add(_sceneView[0].get());
_availableQueue.add(_sceneView[1].get());
}
void Renderer::cull()
{
osgUtil::SceneView* sceneView = _availableQueue.takeFront();
sceneView->cull();
_drawQueue.add(sceneView);
}
void Renderer::draw()
{
osgUtil::SceneView* sceneView = _drawQueue.takeFront();
sceneView->draw();
_availableQueue.add(sceneView);
}
osgUtil::SceneView负责执行裁减和绘制操作。
osgViewer/Renderer.cpp
void Renderer::cull_draw()
{
osgUtil::SceneView* sceneView = _sceneView[0].get();
sceneView->cull();
sceneView->draw();
}