`
u014177758
  • 浏览: 6923 次
社区版块
存档分类
最新评论

探索未知种族之osg类生物---呼吸分解之更新循环三

    博客分类:
  • osg
阅读更多

补充

当然细心的你会发现,_scene->updateSceneGraph(*_updateVisitor)中还有一个imagePager::UpdateSceneGraph()还没有进行讲解,这是因为imagePager和DatabasePager是可以对比这理解的,这里imagePager的主要功能就是加载纹理图片文件。但是imagePager只是负责在另一个线程中加载图片,而没有databasePager的分页功能以及去掉过期数据。这样我们就真的可以重新回到Viewer::updateTraversal()中,继续向下进行了。

Viewer::updateTraversal()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// if we have a shared state manager prune any unused entries
    if (osgDB::Registry::instance()->getSharedStateManager())
        osgDB::Registry::instance()->getSharedStateManager()->prune();
 
    // update the Registry object cache.
    osgDB::Registry::instance()->updateTimeStampOfObjectsInCacheWithExternalReferences(*getFrameStamp());
    osgDB::Registry::instance()->removeExpiredObjectsInCache(*getFrameStamp());
 
 
    if (_updateOperations.valid())
    {
        _updateOperations->runOperations(this);
    }
 
    if (_incrementalCompileOperation.valid())
    {
        // merge subgraphs that have been compiled by the incremental compiler operation.
        _incrementalCompileOperation->mergeCompiledSubgraphs(getFrameStamp());
    }
 
    {
        // Do UpdateTraversal for slaves with their own subgraph
        for(unsigned int i=0; i<getNumSlaves(); ++i)
        {
            osg::View::Slave& slave = getSlave(i);
            osg::Camera* camera = slave._camera.get();
            if(camera && !slave._useMastersSceneData)
            {
                camera->accept(*_updateVisitor);
            }
        }
    }
 
    {
        // call any camera update callbacks, but only traverse that callback, don't traverse its subgraph
        // leave that to the scene update traversal.
        osg::NodeVisitor::TraversalMode tm = _updateVisitor->getTraversalMode();
        _updateVisitor->setTraversalMode(osg::NodeVisitor::TRAVERSE_NONE);
 
        if (_camera.valid() && _camera->getUpdateCallback()) _camera->accept(*_updateVisitor);
 
        for(unsigned int i=0; i<getNumSlaves(); ++i)
        {
            osg::View::Slave& slave = getSlave(i);
            osg::Camera* camera = slave._camera.get();
            if (camera && slave._useMastersSceneData && camera->getUpdateCallback())
            {
                camera->accept(*_updateVisitor);
            }
        }
 
        _updateVisitor->setTraversalMode(tm);
    }
 
    if (_cameraManipulator.valid())
    {
        setFusionDistance( getCameraManipulator()->getFusionDistanceMode(),
                            getCameraManipulator()->getFusionDistanceValue() );
 
        _cameraManipulator->updateCamera(*_camera);
    }
 
    updateSlaves();
 
    if (getViewerStats() && getViewerStats()->collectStats("update"))
    {
        double endUpdateTraversal = osg::Timer::instance()->delta_s(_startTick, osg::Timer::instance()->tick());
 
        // update current frames stats
        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal begin time", beginUpdateTraversal);
        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal end time", endUpdateTraversal);
        getViewerStats()->setAttribute(_frameStamp->getFrameNumber(), "Update traversal time taken", endUpdateTraversal-beginUpdateTraversal);
    }
      • 1、大家应该还记得前面提到的SharedStateManager,用于node间储存共享的属性或状态。我们将要遇到的下一个if就是要遍历这个SharedStateManager所有储存的共享状态,删除其中不再被引用到的。
      • 2、更新又一次被外部引用的在缓存中的对象的时间戳,以保证他不会被清除掉。然后就是清除掉已经过期的在缓存中的对象
      • 3、_updateOperations代表更新任务的队列,然后取得任务队列(OperationQueue),注意这里要使用 Mutex 互斥锁,避免用户追加任务时与线程的执行产生冲突。获取任务队列中的一个任务(OperationQueue::getNextOperation)。这个函数看似简单,只要从 std::list 列表中取出一个 osg::Operation 对象就可以了。但是其中还是有诸多的注意事项:首先,如果任务列表是空的,渲染线程将选择暂时阻塞自己(使用 block 函数),直到有新的 Operation 操作加入到队列中为止。其次,我们有一个任务列表迭代器_currentOperationIterator,如果这个迭代器已经到达列表的末尾,则自动将其转至列表首部,这样就可以在线程中循环执行任务列表中的内容。如果迭代器取得了一个 Operation 操作任务,那么我们需要判断这个任务是否将被反复执行,即,迭代器转至任务列表首部之后,是否还可以取得这个任务。判断所用的函数是Operation::getKeep,这个函数返回 true 时,任务将允许反复执行(例如场景筛选和绘制的任务),否则任务将被随即从列表中移除,我们也不会再取得这个 Operation 对象(除非再次将其加入列表)
      • 4、把已经编译好的子图进行合并。然后更新所有从相机自己的子图。调用任何相机更新回调,但只遍历那个回调,不要遍历其子图,将其留给场景更新遍历。
      • 5、使用相机操作器更新相机的位置。然后就是调用所有从相机的更新回调函数。并记录更新循环中的所有的信息。

现在我们总有算是完成了漫长的 updateTraversal 函数之旅。我们明天开始更艰巨的任务osgViewer:: ViewerBase::renderingTraversals()。

原文链接 http://www.3wwang.cn/blog/article.ftl?id=32

分享到:
评论

相关推荐

    osg3.6.4-osgEarth2.10.2-x86-x64-VS2019开发库

    截止到2020/03/10最新版本的osg和osgEarth开发库,osg版本为3.6.4,osgEarth版本为2.10.2,之前编译了VS2017版本的开发库,有网友反映需要32位的开发库,当时确实没时间专门编译32位的开发库,最近正好有个项目需要...

    osg3.4-osgearth2.8-2015-x64.7z

    标题 "osg3.4-osgearth2.8-2015-x64.7z" 暗示了这是一个针对64位Windows系统(x64)的软件包,包含了OpenSceneGraph(osg)3.4版本和osgEarth 2.8版本的相关组件。OpenSceneGraph是一个开源的3D图形库,而osgEarth则...

    osg-windows-binaries-master.zip

    【osg-windows-binaries-master.zip】是一个包含osg285版本的OpenSceneGraph(简称OSG)库的压缩包,特别针对Windows平台进行了优化。OpenSceneGraph是一个开源的高性能图形库,广泛用于3D图形应用程序开发,如游戏...

    osg-data-master.zip

    【osg-data-master.zip】是一个包含osgEarth相关数据的压缩包,这个名字暗示了它与开源图形库OpenSceneGraph(OSG)的扩展模块osgEarth有关。OpenSceneGraph是一个强大的3D图形编程库,主要用C++编写,广泛应用于...

    osg同心球-osg同心球-osg同心球

    【osg同心球】是OpenSceneGraph(简称osg)库中的一个特定概念,它涉及3D图形编程和场景图管理。OpenSceneGraph是一个开源的高性能3D图形库,用于创建交互式实时应用程序。在这个上下文中,"同心球"可能指的是一个...

    gwaldron-osgearth-osgearth-2.8-0-g449e80a

    《gwaldron-osgearth-osgearth-2.8-0-g449e80a:探索OSGEarth的2.8.0版本》 在IT领域,尤其是在三维地理信息系统(GIS)的世界中,osgEarth是一个备受瞩目的开源项目。这个名为“gwaldron-osgearth-osgearth-2.8-0-...

    osg2cesiumApp-V1.10.zip

    《OSG2CesiumApp-V1.10:将倾斜摄影osgb数据转换为3DTiles的实用工具》 在现代地理信息系统(GIS)和虚拟现实应用中,3DTiles是一种广泛采用的数据格式,它允许高效地在Web浏览器中加载和展示大规模三维地形和建筑...

    OSGEarth-2.10.2.rar

    osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了瓦片调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,TMS,VPB,filesystem等),再结合一套地理投影转换插件...

    编译osgearth-osgearth-2.5所需要的依赖包

    编译osgearth-osgearth-2.5所需要的依赖包 包括以下资源: 3rdParty_VC10_x86_x64.zip curl-7.25.0.zip expat-win32bin-2.0.1.rar gdal181.zip geos-3.2.3.tar.bz2 libzip(vs10).rar OpenSceneGraph-3.0.1.zip ...

    gwaldron-osgearth-osgearth-2.7-0-g25ce0e1.zip

    描述中的“gwaldron-osgearth-osgearth-2.7”是对标题的简洁重申,进一步强调了这是osgEarth的2.7版本,可能由开发者gwaldron维护或贡献。 【osgEarth知识详解】 osgEarth是一个强大的C++库,它利用OpenSceneGraph...

    OSGEARTH210-OSG3.6.5.zip(OSGEarth2.10二进制预编译包)

    1、OSGEarth2.10源码预编译好的二进制开发包(64位) 2、基于OSG3.6.5版本 3、基于Visual Studio2019编译的64位版本

    osg3.6.4-osgEarth2.10.2-x86-x64-VS2019-VS2017-VS2015.zip

    截止到2020/03/10最新版本的osg和osgEarth开发库,osg版本为3.6.4,osgEarth版本为2.10.2,之前编译了VS2017版本的开发库,有网友反映需要32位的开发库,当时确实没时间专门编译32位的开发库,最近正好有个项目需要...

    VS2019-OSG3.6.5-OsgEarth3.0.4-Debug-Release-X64

    在网上看了很多个版本的编译库,感觉不是很符合需求,有些库太老,有些依赖库版本不一致,我特意根据osg3.6.5和gdal3.0.4编译了VS2019版本的osgearth3.1,O基于GL2版本,适用性较强,亲测可用,无异常,同时提交了...

    osgearth-osgearth-3.0.rar

    《osgearth:构建3D地理可视化应用的开源框架》 osgEarth是一个基于OpenSceneGraph(osg)的开源库,用于创建交互式的3D地球应用程序。它提供了丰富的功能,包括地形渲染、遥感图像处理、GPS数据集成以及各种地理...

    osg3.4-2015-x64.7z

    1. **三维几何处理**:osg支持多种几何对象的创建、编辑和渲染,如点、线、面、多边形等,并提供了强大的几何操作函数。 2. **纹理和材质管理**:osg可以加载和管理各种纹理,包括2D、3D、立方体纹理等,同时支持...

    osg-wpf-master.zip

    【osg三维图形库】 osg(OpenSceneGraph)是一个开源的高性能3D图形库,它基于OpenGL,用于构建复杂的实时3D应用。osg的核心是场景图模型,它允许开发者以树形结构组织3D对象和图形状态,使得渲染、动画和交互操作...

    OSG转osgb-obj-ive格式工具.rar

    "OSG转osgb-obj-ive格式工具.rar"是一个专门用于3D模型格式转换的实用程序,主要服务于倾斜摄影模型的处理工作。这个压缩包包含了能够将osg、osgb、ive和obj等格式互相转换的软件工具,这极大地提升了在不同平台和...

    OSG-Dragger-Dragger.zip_osg_osg dragger

    在`OSG-Dragger-Dragger.pdf`文档中,读者可以期待找到更多关于`osg::Dragger`类的详细信息,包括如何创建和使用自定义的Dragger,以及如何结合`PointInfo`进行更复杂的交互设计。这份资料将帮助开发者深入理解如何...

    osgearth-osgearth-2.3.zip

    OSGEARTH是一个开源的地球可视化库,它基于OpenSceneGraph(OSG)构建,用于创建交互式的3D地球应用程序。OSGEarth 2.3版本是这个项目的其中一个稳定发行版,提供了许多增强的功能和改进。在了解这个压缩包的内容...

    osgQt-master.zip.zip

    3. **渲染循环**:由于osg有自己的渲染循环,而Qt也有自己的事件处理循环,所以需要协调这两个循环,确保3D视图能够正确更新。 4. **性能优化**:在嵌入osg到Qt时,可能会面临性能问题,因为两个框架都可能有自己的...

Global site tag (gtag.js) - Google Analytics