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

总结
前面我们基本上已经完成对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类生物---呼吸分解之渲染遍历一的更多相关文章
- 探索未知种族之osg类生物---呼吸分解之渲染遍历二
那么今天我们就正式进入osg整个呼吸动作之中最复杂的一个动作,ViewerBase::renderingTraversals(),我们先介绍renderingTraversals的开头的简单的几步操作 ...
- 探索未知种族之osg类生物---呼吸分解之事件循环一
事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环.更新循环以及渲染循环了.首先我们来区分一下事件循环和渲染循环,他们两个首先是两个不同顺序执行的过程,我们有时候会用到任意node的updateC ...
- 探索未知种族之osg类生物---呼吸分解之advance
回顾 我们用了两节的内容才堪堪讲解完ViewerBase::frame()函数中调用的realize()---Viewer:: realize()函数.我们简单的总结就是Viewer:: realiz ...
- 探索未知种族之osg类生物---呼吸分解之更新循环二
_scene->updateSceneGraph(*_updateVisitor); 我们用了前面4节才刚刚算是完成对DatabasePager::DatabaseThread::run()函数 ...
- 探索未知种族之osg类生物---呼吸分解之更新循环一
上节总结 前几天我们大体上介绍完成了osg的事件循环的介绍,总结一下osg的时间循环主要就是得到平台(windows)的所有消息,并遍历所有的node的eventCallback,并对他们进行处理.接 ...
- 探索未知种族之osg类生物---呼吸分解之事件循环二
VPM矩阵 1.V 表示摄像机的观察矩阵(View Matrix),它的作用是把对象从世界坐标系变换到摄像机坐标系.因此,对于世界坐标系下的坐标值 worldCoord(x0, y0, z0),如果希 ...
- 探索未知种族之osg类生物---呼吸分解之更新循环三
补充 当然细心的你会发现,_scene->updateSceneGraph(*_updateVisitor)中还有一个imagePager::UpdateSceneGraph()还没有进行讲解, ...
- 探索未知种族之osg类生物---呼吸分解之事件循环三
那我们就开始处理这些事件中得到的所有的交互事件,首先我们要判断这些事件是否包含osg的退出事件,那什么情况下会触发这个退出事件呢?如果您运行过osg中example中的小例子的,聪明的你一定就会发现当 ...
- 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系
节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...
随机推荐
- 修改postgres密码
转载自:https://www.cnblogs.com/kaituorensheng/p/4735191.html 1. 修改PostgreSQL数据库默认用户postgres的密码 Postgr ...
- AIOps指导
AIOps代表运维操作的人工智能(Artificial Intelligence for IT Operations), 是由Gartner定义的新类别,Gartner的报告宣称,到2020年, ...
- bananapi+OLED做的一个打地鼠游戏,c语言编程
说明一下:BPI是对拍死的BPI的计数,对应最终的成绩RANK是难度 数值越低难度越高 每当打死10个BPI以后就会减一即难度高一级 默认初始化RANK等于15 DIE是存在的BPI数量,一旦数量大于 ...
- Office_PPT_让你一分钟完成上百张图片的快速保存
1 方式 修改PPT文件格式,由PPT修改为rar,再进行解压操作 进入到ppt->media中找到你在PPT为文件中使用的图片. 2 PPT北京图片下载网址 别样网:https://www.s ...
- Deployment Descriptor Web.xml
Deployment Descriptor部署描述符: - 部署描述符是要部署到Web容器或EJB容器的Web应用程序或EJB应用程序的配置文件. - 部署描述符应包含EJB应用程序中所有企业bean ...
- windows:plsql配置oracle连接
1.plsql安装 此处省略,后续添加 2.plsql连接oracle: (1) 下载Instant client:http://www.oracle.com/technetwork/cn/topic ...
- Tomcat 配置详解和优化
2018年01月09日 18:14:41 tianxiaojun2014 阅读数:306 转自:https://www.cnblogs.com/xbq8080/p/6417671.html htt ...
- JVM 符号引用与直接引用
Java类从加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括,加载 ,验证 , 准备 , 解析 , 初始化 ,卸载 ,总共七个阶段.其中验证 ,准备 , 解析 统称为连接. ...
- 怎样让scrollview滚动到底部?
- (void)scrollsToBottomAnimated:(BOOL)animated { CGFloat offset = self.tableView.contentSize.height ...
- Centos Tomcat监控
1.Window环境下jdk的bin目录中提供jvisualvm.exe工具,但是linux环境中的jdk未提供. 用window下的jvisualvm远程监控linux环境下的tomcat 两种连接 ...