总结

前面我们基本上已经完成对ViewerBase::frame()函数的探究,只剩下renderingTraversals()渲染遍历的探究,虽然就剩下了一个函数,但是这却是最重要的,不可少的一个步骤。他主要是完成对场景的筛选和绘制工作,以及很多线程的调度和同步工作也是在这个函数中完成的。前面的几天我们主要是讲解了完成三个主要的遍历函数,我们来总结一下。

advance(simulationTime);  // 记录场景的帧数,帧速率信息

eventTraversal();         // 处理场景的交互事件及其回调

updateTraversal();        // 处理场景的更新回调,以及分页数据的更新

所以我们总结上面的三个动作主要是,更新用户数据, 负责场景对象的运动和管理等等;而这里并没有涉及到有关场 景筛选或绘制的源代码,而是着重于有关用户更新(APP)操作的各类内容,而这些代码中 也几乎没有涉及到线程与多核处理的内容(分页数据库的处理线程是个例外,它并非是与场 景渲染相关的内容)。那么今天我们主要是讲解renderingTraversals()函数。

四种线程模式

因为这里我们会涉及到OSG 目前 提供的四种线程模型。所以我们先来简单的介绍一下他们。OSG 的视景器包括四种线程模型,可以使用 setThreadingModel 进行设置,不同的线程 模型在仿真循环运行时将表现出不同的渲染效率和线程控制特性。通常而言,这四种线程的 特性如下:

SingleThreaded:单线程模型。OSG 不会创建任何新线程来完成场景的筛选和渲染,因 而也不会对渲染效率的提高有任何助益。它适合任何配置下使用。

CullDrawThreadPerContext:OSG 将为每一个图形设备上下文(GraphicsContext)创建 一个图形线程,以实现并行的渲染工作。如果有多个 CPU 的话,那么系统将尝试把线程分 别放在不同的 CPU 上运行,不过每一帧结束前都会强制同步所有的线程。

DrawThreadPerContext:这一线程模型同样会为每个 GraphicsContext 创建线程,并分配 到不同的 CPU 上。十分值得注意的是,这种模式会在当前帧的所有线程完成工作之前,开 始下一帧。

CullThreadPerCameraDrawThreadPerContext:这一线程模型将为每个 GraphicsContext 和每个摄像机创建线程,这种模式同样不会等待前一次的渲染结束,而是返回仿真循环并再 次开始执行 frame 函数。如果您使用四核甚至更高的系统配置,那么使用这一线程模型将 大限度地发挥多 CPU 的处理能力。

与 DrawThreadPerContext 和 CullThreadPerCameraDrawThreadPerContext 这两种同样可 以用于多 CPU 系统,且相对更有效率的线程模型相比,CullDrawThreadPerContext 的应用范 围比较有限;而 SingleThreaded 模式在单核以及配置较低的系统上运行稳定。

今天只是对renderingTraversals(); // 场景的渲染遍历工作,开一个小头,因为它的内容比较的丰富,所以我需要一些时间梳理一下思路。

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

探索未知种族之osg类生物---呼吸分解之渲染遍历一的更多相关文章

  1. 探索未知种族之osg类生物---呼吸分解之渲染遍历二

    那么今天我们就正式进入osg整个呼吸动作之中最复杂的一个动作,ViewerBase::renderingTraversals(),我们先介绍renderingTraversals的开头的简单的几步操作 ...

  2. 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...

  3. 探索未知种族之osg类生物---呼吸分解之advance

    回顾 我们用了两节的内容才堪堪讲解完ViewerBase::frame()函数中调用的realize()---Viewer:: realize()函数.我们简单的总结就是Viewer:: realiz ...

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

    _scene->updateSceneGraph(*_updateVisitor); 我们用了前面4节才刚刚算是完成对DatabasePager::DatabaseThread::run()函数 ...

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

    上节总结 前几天我们大体上介绍完成了osg的事件循环的介绍,总结一下osg的时间循环主要就是得到平台(windows)的所有消息,并遍历所有的node的eventCallback,并对他们进行处理.接 ...

  6. 探索未知种族之osg类生物---呼吸分解之事件循环二

    VPM矩阵 1.V 表示摄像机的观察矩阵(View Matrix),它的作用是把对象从世界坐标系变换到摄像机坐标系.因此,对于世界坐标系下的坐标值 worldCoord(x0, y0, z0),如果希 ...

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

    补充 当然细心的你会发现,_scene->updateSceneGraph(*_updateVisitor)中还有一个imagePager::UpdateSceneGraph()还没有进行讲解, ...

  8. 探索未知种族之osg类生物---呼吸分解之事件循环三

    那我们就开始处理这些事件中得到的所有的交互事件,首先我们要判断这些事件是否包含osg的退出事件,那什么情况下会触发这个退出事件呢?如果您运行过osg中example中的小例子的,聪明的你一定就会发现当 ...

  9. 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系

    节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...

随机推荐

  1. MySql开启远程账户登陆总结

    1.更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"127.0.0.1"改成"% ...

  2. Java同步学习(持续更新)

    在需要考虑线程安全性的场合,可以考虑以下五种方式来实现线程的安全性: 1.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,   ...

  3. SpringBoot Web开发(3) WebMvcConfigurerAdapter过期替代方案

    springboot2.0中 WebMvcConfigurerAdapter过期替代方案 最近在学习尚硅谷的<springboot核心技术篇>,项目中用到SpringMVC的自动配置和扩展 ...

  4. 报错:org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.

    报错环境: CDH中集成的hive服务,启动报错,所以初始化一下元数据. 配置文件:/etc/hive/conf hive-site.xml 命令目录:/opt/cloudera/parcels/CD ...

  5. SPI、I2C、UART、I2S、GPIO、SDIO、CAN 简介

    转自http://sanwen.net/a/fmxnjoo.html SPI.I2C.UART.I2S.GPIO.SDIO.CAN,看这篇就够了 总线 总线,总要陷进里面.这世界上的信号都一样,但是总 ...

  6. enctype=“multipart/form-data”详解

    enctype这个属性管理的是表单的MIME(Multipurpose Internet Mail Extensions)编码,共有三个值可选: 1.application/x-www-form-ur ...

  7. mkimage command not found – U-Boot images will not be built

    ubuntu 14.04 64位系统编译Linux kernel时提示: “mkimage” command not found – U-Boot images will not be built 按 ...

  8. JavaWeb——java.lang.UnsatisfiedLinkError

    java.lang.UnsatisfiedLinkError: Native Library sqlite-3.8.6-amd64-sqlitejdbc.dll already loaded in a ...

  9. Sublime Text 3激活

    Sublime Text 3激活方式: 一.修改hosts文件: 1:windows系统:      找到 C:\Windows\System32\drivers\etc\hosts 这个文件,  用 ...

  10. Python与设计模式之创建型模式及实战

    用Python学习一下设计模式,如果很枯燥的话,就强行能使用的就用一下.设计模式参考Python与设计模式-途索 1. 单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. import ...