探索未知种族之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,一经查实,立即删除!

相关文章

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

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

如何进行.NET高效开发

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

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

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

配置msf连接postgresql数据库

BackTrack 5 R3版本的Metasploit在每次的升级后总会出现奇奇怪怪的错误,主要是Ruby的库出错,网上找了一些解决的办法,但每次更新后又会出错,蛋碎。 解决方法: BackTrack 5中默认自动开启端口7337。 1、查看PostgreSQL端…

web文件加密

讲解以及源代码下载ASP.NET 2.0: Encrypting Connection Strings http://blogs.vertigosoftware.com/snyholm/archive/2005/12/16/1746.aspx http://msdn2.microsoft.com/en-us/library/yxw286t2.aspx中文http://msdn2.microsoft.com/zh-cn/library/yxw286t2.aspx ASP.NET 2.0:…

java开发和android开发_浅谈Java开发和Android开发的不同

Java是具有多种用例的完整开发语言,包括Web开发,PC程序开发,嵌入式开发等。Android开发是面向手机应用,使用Java较多,还有常用的H5跨平台混合架构模式。一,UI界面开发不同1)Java Swing现在Java开发基本上都…

远程上传下载文件-Xftp5

Xftp5下载 链接:https://pan.baidu.com/s/1Wzso_Q7mPy5uGOUlripEWg 密码:xfx9 安装选择家庭版 由于21端口没有开,所以不能选FTP, 选择SFTP,22端口 用哪个用户登录机会自动到该用户的家目录 连接上出先乱码问题 属性 OK. 转载于:h…

java反射 pdf_java反射学习笔记整理.pdf

java反射学习笔记整理.pdf还剩15页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,很抱歉,此页已超出免费预览范围啦!如果喜欢就下载吧,价低环保!内容要点:Java 反射笔…

变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题解 简要提炼思路: 1、有n个台阶,则每次可以跳1,2,3,,,n个…

Visual Basic .NET处理Excle表格全接触

Visual Basic .Net处理Excel表格机理和处理Word文档一样,也是通过互操作,引入COM组件来实现的,所以前提条件是运行本文中介绍的程序的计算机必须安装Office 2000中的Excel软件。如果计算机安装的Office 2000,那么这个COM组件就是M…

aspnet_UsersInRoles_GetUsersInRoles

ALTERPROCEDUREdbo.aspnet_UsersInRoles_GetUsersInRoles --查询某角色的用户ApplicationNameNVARCHAR(256), RoleNameNVARCHAR(256)ASBEGINDECLAREApplicationIdUNIQUEIDENTIFIERSELECTApplicationIdNULLSELECTApplicationIdApplicationId FROMaspnet_Applications WHERELO…

Jenkins二 安装gitlab及其使用

git --version 如果没有安装git直接源码安装即可,如果安装了先删除原来的git。 yum -y remove git先安装编译git需要的包。 yum install zlib-devel perl-CPAN gettext curl-devel expat-devel gettext-devel openssl-devel下载&安装 去gitlab官网 https://abou…

编程使用资源文件实现多语言页面(In Action)

需求&#xff1a;我们的ASP.NET站点需要提供多语言支持&#xff0c;考虑到我们使用的是ASP.NET2.0&#xff0c;我们可以利用资源文件来实现。 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />NOTE:这里我们使用编程的方法实现&a…

java final内存机制_Java中的内存处理机制和final、static、final static总结

装载自&#xff1a;http://blog.csdn.net/wqthaha/article/details/20923579Java程序运行在JVM上&#xff0c;可以把JVM理解成Java程序和操作系统之间的桥梁&#xff0c;JVM实现了Java的平台无关性&#xff0c;由此可见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记…

MySQL中的字符集涵义及使用方法总结(二)

五.乱码的避免最好让上述9个字符集变量值保持一致&#xff0c;或者至少“兼容”&#xff0c;同时也要考虑到OS中locale的值。当然&#xff1a;character_set_system例外&#xff0c;它是存储和表示元信息使用的字符集&#xff0c;一般都是ascii串&#xff0c;使用utf8和使用lat…

vim 多行添加注释,取消注释

转发 已经验证 https://blog.csdn.net/SuiXin_123/article/details/81393397转载于:https://www.cnblogs.com/pingg/p/10509301.html

调用未知DLL中的导出函数

不知道诸位看官是否有过这样的经历&#xff1a;在不经意之间发现一个DLL文件&#xff0c;它里边有不少有趣的导出函数——但是由于你不知道如何调用这些函数&#xff0c;所以只能大发感慨而又无能为力焉。固然有些知名的DLL可以直接通过搜索引擎来找到它的使用方式&#xff08;…

构建之法与博客首秀

问题一&#xff1a;软件的安全功能是指什么呢&#xff1f; 我看了《构建之法》第七页对飞机安全功能的的描述&#xff0c;想知道在软件中是否有类似飞机的安全功能&#xff1f;如果有&#xff0c;具体是指什么功能呢&#xff1f;我在查阅资料后只找到对软件安全的的总结(软件安…

java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...

ImportSelector&#xff1a;返回需要导入的组件的全类名数组创建一个实现了ImportSelector接口的类&#xff0c;然后让入Import中。ImportSelector的实现类包含了所有需要导入到容器中的组件。public class StuConfigurationImportSerlect implements ImportSelector {Override…

java builder pool_每周10道Java面试题:String, String Pool, StringBuilder

每周10道 Java 面试题由 ImportNew 整理编译自网络。1. 写出下面代码的运行结果。int src 65536;Integer dst new Integer(65536);System.out.println(src dst);System.out.println(dst.equals(src));答案&#xff1a; true true考点&#xff1a; Integer 的 equals 实现。查…