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

updateTraversal

上节总结

前几天我们大体上介绍完成了osg的事件循环的介绍,总结一下osg的时间循环主要就是得到平台(windows)的所有消息,并遍历所有的node的eventCallback,并对他们进行处理。接下来我们就要进入osg的另一个维持生命的循环---更新循环。

更新循环

OSG 更新循环的作用与事件回调有类似之处:由专门的访问器对象_updateVisitor 的负 责场景图形更新遍历;所有的节点和 Drawable 几何体对象都可以使用 setUpdateCallback 设 置更新回调;通过具现 NodeCallback::operator()或者 Drawable::UpdateCallback::update 函数, 可以在回调对象中添加自定义的工作。

但是,更新回调与事件回调不同之处在于:事件循环是在当一个用户交互动作或系统事件产生时,每个节点(以及 Drawable 对象)的事件回调才会被调用一次;而节点(以及 Drawable 对象)的更新回调只会在每帧中被调用一次。这一区别决定了我们应当在什么时候使用事件回调, 以及在什么时候使用更新回调。

osgViewer::Viewer::updateTraversal()

那我们就开始进入osgViewer::Viewer::updateTraversal(),updateTraversal和eventTraversal一样首先都要定义目前处在的时间以及帧数,并进行记录,这样有利于进行统计分析。下面我们就要进入osgViewer::Viewer::updateTraversal()里最重要的函数osgViewer::Scene::updateSceneGraph()函数。

这个函数中我们先介绍一下它的主体功能,再去介绍这里遇到的一些新的概念。主要功能:

1、使用DatabasePager::updateSceneGraph函数更新场景的分页数据库,异步处理在分页数据库处理线程中。

2、ImagePager::updateSceneGraph函数, 更新场景的分页图像库,异步处理在分页数据库处理线程中。

3、设置图片请求的处理器。

我们先介绍一下DatabasePager和ImagePager

DatabasePager:分页数据库。在大型三维场景中采用数据分页的方式进行动态调度。这里“分页”的意思是随着视口范围的变化,场景只加载和渲染当前视口范围内数据,并将离开视口范围内的数据清除内存(可以设定不同的数据卸载策略),不再渲染。保证内存中只有有限的数据量,场景的每一帧也只有有限的数据被送到图形渲染管道,从而提高渲染性能。

ImagePager: 分页图像库。查看ImagePager 的相关内容了。这个类的工作 性质与 DatabasePager 没什么大的区别,它主要负责的是纹理图片文件的运行时加载工作。

DatabasePager和ImagePager都会用到独立的线程进行他们自己的工作。我们想要进入读懂他们代码的内容,首先我们得具备openThread的基本知识。

openThread的基本知识

面向对象的跨平台线程库 OpenThreads 原本是独立的开源工程,OSG 2.x 以后的版本将 其纳入了自己的体系结构当中,成为 OSG 基本库的一份子。 OpenThreads 库包含了以下几个主要的线程处理类: Thread 类:线程实现类。它是一个面向对象的线程实现接口,每定义一个 Thread 类, 就相当于定义了一个共享进程资源,但是可以独立调度的线程。通过重写 run()和 cancel()这 两个成员函数,即可实现线程运行时和取消时的操作;通过调用 start()和 cancel(),可以启 动或中止已经定义的进程对象。 Mutex 类:互斥体接口类。如同 pthread 等常用的线程库那样,OpenThreads 也提供了互 斥体操作的机制,它有效地避免了各个线程对同一资源的相互竞争,即,某一线程欲操作某 一共享资源时,首先使用互斥体成员的 lock()函数加锁,操作完成之后再使用 unlock 函数解锁。一个线程类中可以存在多个 Mutex 成员,用于在不同的地点或情形下为共享区域加锁; 但是一定要在适当的时候解锁,以免造成线程的共享数据无法再访问。 Condition 类:条件量接口类。它依赖于某个 Mutex 互斥体,互斥体加锁时阻塞所在的 线程,解锁或者超过时限则释放此线程,允许其继续运行。 这里涉及了几个线程操作中重要的概念:同步,阻塞以及条件变量。线程同步,简单来 说就是使同一进程的多个线程可以协调工作,例如让它们都在指定的执行点等待对方,直到 全员到期之后才开始同步运行;拥塞,即强制一个线程在某个执行点上等待,直到满足继续 运行的条件为止。例如其它的线程到达同一执行点,某个变量初始化完成等等,可以通过条 件变量来设计各种条件。 Block 类:阻塞器类。顾名思义,这个类的作用就是阻塞线程的执行,使用 block()阻塞 执行它的线程(注意,不一定是定义它的 Thread 线程,而是当前执行了 block 函数的线程, 包括系统主进程),并使用 release()释放之前被阻塞的线程。 下图所示的代码实现了一个简单的线程,并演示了 Block 类的使用方法。运行程序后 可以发现,Block::block()函数将首先阻塞主进程,被释放后再次阻塞的是 TestThread 线程, 这与它是谁的成员变量并无关系。BlockCount 类:计数阻塞器类。它与阻塞器类的使用方法基本相同:block()阻塞线程, release()释放线程;不过除此之外,BlockCount 的构造函数还可以设置一个阻塞计数值。计 数的作用是:每当阻塞器对象的 completed()函数被执行一次,计数器就减一,直至减到零 就释放被阻塞的线程。 Barrier 类:线程栅栏类。这是一个对于线程同步颇为重要的阻塞器接口,它的构造函 数与 BlockCount 类似,可以设置一个整数值,我们可以把这个值理解成栅栏的“强度”。每 个执行了 Barrier::block()函数的线程都将被阻塞;当被阻塞在栅栏处的线程达到指定的数目时,就好比栅栏无法支撑那么大的强度一样,栅栏将被冲开,所有的线程将被释放。重要的 是,这些线程是几乎同时释放的,也就保证了线程执行的同步性。 注意 BlockCount 与 Barrier 的区别,前者是由其它任意线程执行指定次数的 completed() 函数,即可释放被阻塞的线程;而后者则是必须阻塞指定个数的线程之后,所有的线程才会 同时被释放。 ScopedLock 模板:这个模板是与 Mutex 配合出现的,它的作用域之内将对共享资源进 行加锁,作用域之外则自动解锁。

 

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

转载于:https://www.cnblogs.com/wang985850293/p/10469727.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EXLIBRIS】纸版书目整理 -- 大书架 上 【292 种】【327册】

为了避免往年光说不练的现象,提前开始整理,并post在这里,接受监督,:)一、大书架 上 【292 种】【327册】书名存放位置出版社史记(全本)大书架上中州古籍出版社儒林外史大书架上岳麓书…

CSS3属性——(一)

在CSS中追加了三个属性选择器:[att*val]、[att^val]、[att$val] [att*val]属性选择器 如果元素用att表示的属性的值中包含用val指定的字符,那么该元素使用这个样式。 [att^val]属性选择器 如果用att表示的属性值的开头字符为用val指定的字符的话&#xf…

[vue] v-if和v-for的优先级是什么?如果这两个同时出现时,那应该怎么优化才能得到更好的性能?

[vue] v-if和v-for的优先级是什么?如果这两个同时出现时,那应该怎么优化才能得到更好的性能? v-for 的优先级更高 避免出现这种情况,如果实在需要,则在外嵌套template,在这一层进行v-if判断,然…

JSP实战型程序连载:通用数据库连接JavaBean

package online;import java.sql.*;public class DBConn {private static String rootpath "web发布路径";private String sample "sample";private Connection con null;private Statement stmt null;ResultSet rs null;/**************************…

java变换变量赋值_Java变量的类型转换

在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换和强制类型转换。自动类型转换自动类型转换也叫隐式类型转换,指的是两种数据类型在转换…

字符串的拼接

再字符串的拼接的时候对一些字符需要进行转译&#xff0c;要不然会出现问题 var btn <button class"jui-form-button" type"button" οnclick"save_msg(\ json[i].id \,\ json[i].template \,document.getElementById(\disab i \).value,do…

[vue] vue在组件中引入插件的方法有哪些?

[vue] vue在组件中引入插件的方法有哪些&#xff1f; 插件通常用来为 Vue 添加全局功能。插件的功能范围没有严格的限制——一般有下面几种&#xff1a;添加全局方法或者属性。如: vue-custom-element添加全局资源&#xff1a;指令/过滤器/过渡等。如 vue-touch通过全局混入来…

]英文资料大全

语法 http://www.dailygrammar.com/ adventuretv,提供视频资料&#xff0c;内容多是各地的风土人情&#xff0c;很不错。 http://www.adventuretv.com/ 纽约时报&#xff0c;网上看新闻的好地方 http://www.nytimes.com/ 英文MP3下载的好地方 http://www.mp3raid.com/archiv…

java linearlayout_LinearLayout属性用法和源码分析

对于一个View(ViewGroup)来说实现无非于三个流程&#xff0c;onMeasure(测量)&#xff0c;onLayout(定位)&#xff0c;onDraw(绘制)&#xff0c;接下来就对这三个部分一一分析但是首先还是对LinearLayout变量进行介绍1.LinearLayout变量其实LinearLayout变量与上篇属性篇中关联…

[vue] vue实例挂载的过程是什么?

[vue] vue实例挂载的过程是什么&#xff1f; render, 没有则去编译编译vdom对实例进行watch个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

如何进行.NET高效开发

sugar 2006-03-12 13:53 转载于:https://www.cnblogs.com/SCOTT-SUN/archive/2006/06/02/416077.html

Linux 系统更改界面显示详解

1,修改配置文件 # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/…

jni c java互相调用_通过JNI实现Java和C++的相互调用

评论# re: 通过JNI实现Java和C的相互调用2008-07-29 14:14Always BaNg.不错&#xff0c;把字符转换也一并讲了吧&#xff0c;比如UTF-8的处理&#xff0c;USC-2与MBCS转换等。 回复 更多评论# re: 通过JNI实现Java和C的相互调用[未登录]2008-07-29 14:17role0523你是指Java和…

Apache——Introduction

Apache——IntroductionIntroduction Apache是有着10年悠久历史的项目了&#xff0c;据有关方面的调查&#xff0c;有超过70&#xff05;的站点都使用Apache作为Web Server&#xff0c;可见其应用的广泛了。Apache适用于现代的各种操作系统&#xff0c;包括Unix、Linux和Window…

洛谷 P3244 / loj 2115 [HNOI2015] 落忆枫音 题解【拓扑排序】【组合】【逆元】

组合计数的一道好题。什么非主流题目 题目背景 &#xff08;背景冗长请到题目页面查看&#xff09; 题目描述 不妨假设枫叶上有 \(n​\) 个穴位&#xff0c;穴位的编号为 \(1\sim n​\)。有若干条有向的脉络连接着这些穴位。穴位和脉络组成一个有向无环图——称之为脉络图&…

[vue] 说说你对选项el,template,render的理解

[vue] 说说你对选项el,template,render的理解 el: 把当前实例挂载在元素上 template: 实例模版, 可以是.vue中的template, 也可以是template选项, 最终会编译成render函数 render: 不需要通过编译的可执行函数template和render, 开发时各有优缺点, 不过在线上尽量不要有templa…

mysql获取离当前数据最近的数据_Mysql 获取最近数据信息

今天select * from 表名 where to_days(时间字段名) to_days(now());昨天SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) – TO_DAYS( 时间字段名) < 1近7天SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) < date(时间字段名)近30天SELECT * FROM 表名 wh…

参加宴会的烦恼

公司历经很多磨难&#xff0c;终于挺过来了&#xff0c;明天就是正式重新成立的日子&#xff0c;我有幸去参加宴会&#xff0c;要求穿便服&#xff0c;一年四季穿工作服习惯了&#xff0c;自己衣服倒不知道该怎么穿了。看来我又要败家了。。。。。看中的衣服都好贵&#xff0c;…

[vue] 说说你使用vue过程中遇到的问题(坑)有哪些,你是怎么解决的?

[vue] 说说你使用vue过程中遇到的问题&#xff08;坑&#xff09;有哪些&#xff0c;你是怎么解决的&#xff1f; 从详情页返回列表页时, 要保存所有状态, 比如: 滚动条位置, 数据, 下拉数据等 当时想用keep-alive, 后来没用, 直接存储一些关键数据, 返回到router时重新加载了…

python 列表嵌套字典 添加修改删除_【Python】列表嵌套字典修改字典里面的一个值却把全部的值都修改了。...

具体问题就是&#xff1a;当我往空列表里面添加字典&#xff0c;需要修改其中的一个键的值的时候&#xff0c;出现把其他同类的值也修改了。下面就是出现问题的代码&#xff1a;aliens []new_alien {"color": "green"}#往字典里添加5个字典for num in ra…