我试图用两个窗口运行 OpenSceneGraph 查看同一个场景 . 我遇到的是当我加载分页地形数据库时,性能会大幅下降 . 我是使用如下所述的两个单独的图形上下文,还是使用具有相同上下文的两个单独的视图 . 表演大幅下滑 . 一个视图的地形表现得很好 .
With one view:
With two views:
#include <osgDB/ReadFile>
#include <osgGA/TrackballManipulator>
#include <osgViewer/CompositeViewer>
#include <osgViewer/View>
#include <osgViewer/ViewerEventHandlers>
int main(int argc, char** argv)
{
auto terrain = osgDB::readRefNodeFile("archive.txp");
osgViewer::CompositeViewer viewer;
viewer.setThreadingModel(osgViewer::ViewerBase::ThreadingModel::SingleThreaded);
{
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
traits->x = 80;
traits->y = 80;
traits->height = 720;
traits->width = 1280;
traits->windowDecoration = true;
traits->windowName = "One";
traits->doubleBuffer = true;
traits->sharedContext = nullptr;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits);
gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
osg::ref_ptr<osgViewer::View> view = new osgViewer::View();
view->getCamera()->setGraphicsContext(gc);
view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
view->getCamera()->setClearColor(osg::Vec4d(0.2, 0.2, 0.2, 1.0));
view->setCameraManipulator(new osgGA::TrackballManipulator());
view->setSceneData(terrain);
view->addEventHandler(new osgViewer::StatsHandler);
viewer.addView(view);
}
{
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits();
traits->x = 80;
traits->y = 80;
traits->height = 720;
traits->width = 1280;
traits->windowDecoration = true;
traits->windowName = "Two";
traits->doubleBuffer = true;
traits->sharedContext = nullptr;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits);
gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
osg::ref_ptr<osgViewer::View> view = new osgViewer::View();
view->getCamera()->setGraphicsContext(gc);
view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
view->getCamera()->setClearColor(osg::Vec4d(0.2, 0.2, 0.2, 1.0));
view->setCameraManipulator(new osgGA::TrackballManipulator());
view->setSceneData(terrain);
view->addEventHandler(new osgViewer::StatsHandler);
viewer.addView(view);
}
while(viewer.done() == false)
{
viewer.frame();
}
return 0;
}
显然,当两个视图查看相同的地形时,会发生许多额外的遍历 . 我在VTune中对此进行了分析,并确认分页LOD遍历是罪魁祸首 . 是否需要配置某种优化/剔除设置来处理具有多个视图的分页数据库?
Function / Call Stack CPU Time
osg::PagedLOD::traverse 18.170s
osg::Group::traverse 14.624s
osg::PagedLOD::accept 7.617s