总结

前面我们基本上已经完成对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. py-day3-1 python 风湿理论之函数即变量

    # 风湿理论之函数即变量 def foo(): print('from foo') bar() def bar(): print('from bar') foo() from foo from bar ...

  2. VirtualBox网络的Host-Only配置

    创建host-only虚拟网卡 VBox管理器页面-管理-主机网络管理器,如果已经存在默认的虚拟网卡则下一步,如果不存在则创建一个虚拟网卡,不启用DHCP服务器,这里ip地址为192.168.137. ...

  3. android升级gradle到3.4.1

    这两天把gradle升级到了gradle-3.4.1 com.android.tools.build:gradle升级到了com.android.tools.build:gradle:2.3.0 结果 ...

  4. 通过zipfile解压指定目录下的zip文件

    代码: # -*- coding: utf-8 -*- import os import zipfile import platform import multiprocessing # 解压后的文件 ...

  5. WordPress版微信小程序开发系列(二):安装使用问答

    自WordPress版微信小程序发布开源以来,受关注的程度超过我原来的想象.这套程序主要面对的用户是wordpress网站的站长,如果wordpress站想在微信的生态圈得到推广,小程序成为一种重要的 ...

  6. seleniuim面试题1

    seleniuim面试题1 乙醇 创建于 4 个月 之前 最后更新时间 2018-09-11 selenium中如何判断元素是否存在? selenium中没有提供原生的方法判断元素是否存在,一般我们可 ...

  7. [Unity算法]点是否在多边形范围内

    参考链接: https://www.zhihu.com/question/26551754 http://www.cnblogs.com/leoin2012/p/6425089.html 原理如下: ...

  8. Android Room 学习(一)

    Room简介 Room persistence库为SQLite提供了一个抽象层,以便在利用SQLite的全部功能的同时实现更强大的数据库访问. 该库可帮助您在运行应用程序的设备上创建应用程序数据的缓存 ...

  9. halcon批量读取图片

    以前这个代码都是自己写,不仅繁琐,而且容易忘记.其实Halcon中提供了相关的方法.记录一下吧,其实很简单. 读取一个文件夹下的所有图片[助手]>[打开新的image acquisition ] ...

  10. python print格式化输出。

    python print格式化输出. 1. 打印字符串 print ("His name is %s"%("Aviad")) 效果: 2.打印整数 print ...