我试图用两个窗口运行 OpenSceneGraph 查看同一个场景 . 我遇到的是当我加载分页地形数据库时,性能会大幅下降 . 我是使用如下所述的两个单独的图形上下文,还是使用具有相同上下文的两个单独的视图 . 表演大幅下滑 . 一个视图的地形表现得很好 .

With one view:
enter image description here
With two views:
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