1、建立同步锁
osgViewer/ViewBase.cpp
void ViewerBase::startThreading()
{
_endDynamicDrawBlock = new osg::EndOfDynamicDrawBlock(numViewerDoubleBufferedRenderingOperation);
_startRenderingBarrier = new osg::BarrierOperation(numThreadsOnStartBarrier, osg::BarrierOperation::NO_OPERATION);
_endRenderingDispatchBarrier = new osg::BarrierOperation(numThreadsOnEndBarrier, _endBarrierOperation);
for(citr = contexts.begin();
citr != contexts.end();
++citr)
{
osg::GraphicsContext* gc = (*citr);
gc->getState()->setDynamicObjectRenderingCompletedCallback(_endDynamicDrawBlock.get());
gc->getGraphicsThread()->add(_startRenderingBarrier.get());
gc->getGraphicsThread()->add(_endRenderingDispatchBarrier.get());
}
}
osg/OperationThread.cpp
void OperationThread::add(Operation* operation)
{
OpenThrea

本文介绍了osg库中线程同步的实现,包括使用_startRenderingBarrier进行图形线程的绘制同步,_endRenderingDispatchBarrier确保cull操作完成后执行draw,以及_endDynamicDrawBlock作为BlockCount锁协调线程执行。这些同步机制旨在优化主线程与图形线程间的协同,实现高效并行处理。
最低0.47元/天 解锁文章
1475

被折叠的 条评论
为什么被折叠?



