osg探究补充:osg数据加载原理(插件机制简介)
前言
我们接着昨天的继续,昨天主要是讲解了DatabasePager类中的特定的成员变量以及run函数的第一部分,对所要请求加载的数据按照是否是网络数据进行分类加载模式。今天我们就看看数据是怎们加载到osg环境中的。
还是在DatabasePager::DatabaseThread::run()函数中,首先我们保证了databaseRequest是线程安全的,因为run()函数是创建一个唯一的写入_loadedModel指针的线程。首先还是先依据前面的数据来源是否为网络来判断readFromFileCache是否为true来区分加载方式。我们进入从缓存中读取文件的方法ReaderWriter::ReadResult FileCache::readNode(),就会发现这个方法就是判断当前文件是为缓存文件,然后调用Registry::instance()->readNode()。而这个Registry::instance()->readNode()函数也就是当readFromFileCache为false(不是网络文件)时在DatabasePager::DatabaseThread::run()函数中调用的是同一个函数(Registry::instance()->readNode())。所以osg加载数据文件的原理就在这。那我们就深入探究一下osg到底是怎么加载模型文件的。
Registry注册机
首先我们先介绍一下Registry::instance()(单例模式—以后会统一的讲解一下osg中的设计模式)。这个Registry即是osg的插件注册的管理器。也就是说我们使用osg加载数据文件的时候,osg是通过某一种插件来进行加载的。我们通过观察osgDB::Registry类的构造函数就会发现osg是不是默认就会加载插件到环境中,为什么不加载呢,因为osg的插件非常的庞大大概有121种,如果osg启动的时候就要预加载这么多的插件就会导致osg的启动速度非常的缓慢,所以osg采用了职责链的设计模式以加载尽量少的插件。我们就来介绍一个osg是如果查找适合目前功能的插件的。也就是Registry::LoadStatus Registry::loadLibrary(const std::string& fileName)
1、 osg会先搜索已经注册的插件列表_dlList,判断插件是否已经被加载到环境中,如果osg找到了符合次格式的插件,getLibraryItr(fileName)
2、 如果osg没有在_ dlList中找到所需插件,那么osg就会根据文件的名称来去plugins文件夹下寻找(osgDB_+此文件的后缀 )同名的插件,load到环境中。DynamicLibrary* DynamicLibrary::loadLibrary(const std::string& libraryName)
3、 如果还是没有找到相应的插件,就代表此文件I/O的操作再次失败,OSG将返回失败信息。
注:通过查看 Registry ::addFileExtensionAlias成员变量,就可以知道我们平时加载的模型文件对应的插件名称。他们会被osg保存成一个map(_extAliasMap。)
而我们的osg读取文件的前期操作就是要进行插件的选择预加载,例如加载stl模型,osg会去plugins目录下查找osgDB_stl.dll插件进行加载。然后通过插件类集成的load函数来进行文件的读取加载操作。我们可以把读取过程总结为下面一张图片,请大家仔细理解

原文链接 http://www.3wwang.cn/blog/article.ftl?id=28
osg探究补充:osg数据加载原理(插件机制简介)的更多相关文章
- osg探究补充:Node::accept(NodeVisitor& nv)及NodeVisitor简介
前言 在前几节中,我自己觉得讲的比较粗糙,因为实在是时间上不是很充足,今天我想弥补一下,希望不是亡羊补牢.我们在osgViewer::Viewer::eventTraversal()函数中经常看到这么 ...
- osg探究补充:DatabasePager类简介
简介 DatabasePager类,也就是常说的数据库分页技术,简单来说,就是在进行数据库查找时,有可能满足条件的数据很多,为了提高相应速度我们进行数据查找时进行分页查找与显示,当点击下一页时才会进行 ...
- 如何让在Html中特殊字符被数据加载时对于html标签的自动转义 补充
1.将此过滤器添加到ng-bind-html所绑定的数据中,便实现了在数据加载时对于html标签的自动转义. <div ng-repeat="item in list" &g ...
- JQuery 之 在数据加载完成后才自动执行函数
数据加载完成执行: $(window).load(function(){ ... }); 进入页就执行,不论等数据是否加载完成: $(document).ready(function(){ ... } ...
- 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转
最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...
- Echarts通过Ajax实现动态数据加载
Echarts(3.x版)官网实例的数据都是静态的,实际使用中往往会要求从服务器端取数据进行动态显示,官网教程里给出的异步数据加载很粗略,下面就以官网最简单的实例为例子,详细演示如下过程:1.客户端通 ...
- 从 RequireJs 源码剖析脚本加载原理
引言 俗话说的好,不喜欢研究原理的程序员不是好的程序员,不喜欢读源码的程序员不是好的 jser.这两天看到了有关前端模块化的问题,才发现 JavaScript 社区为了前端工程化真是煞费苦心.今天研究 ...
- RE:通过移动端滑动手势实现数据加载
背景: 基于要尝试的移动端项目需要有一个通过上拉下滑手势达成加载不同数据的功能,其涉及到滑动手势和ajax数据加载方面的知识点.故对整个实现过程做一个记录整理.个人JS功底有限,看 ...
- Hive中数据加载失败:root:supergroup:drwxr-xr-x
Hive中数据加载失败:inode=:root:supergroup:drwxr-xr-x 在执行hive,数据加载的时候,遇到了一个错误,如下图: 在执行程序的过程中,遇到权限问题很正常,背后原理也 ...
随机推荐
- 把java程序作为windows服务运行
参考: https://www.jianshu.com/p/fc9e4ea61e13 https://blog.csdn.net/qq_28566071/article/details/8088250 ...
- 不常用的vi命令
vi u 撤回ctrl+r 撤回的撤回 全文替换%s/old/new/g 指定行区间替换12,15s/old/new/g c替换前确认12,15s/old/new/gc 用#代替分隔符,用户关键字有/ ...
- springMVC框架返回JSON到前端日期格式化
在Controller类中,需要返回JSON的方法上加上注释@ResponseBody,这是必须的. 然后spring-servlet.xml配置如下: <?xml version=" ...
- Java异常学习总结二
异常的处理方式 方式一:捕获异常(try-catch-finally) 捕获异常是通过三个关键词来实现的:try-catch-finally.用try来执行一段程序,如果出现异常,系统抛出一个异常,可 ...
- Java八大排序算法
Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...
- 杂谈2.cpp
Ostream类定义的插入运算符(<<)使数据插入到输出流,istream定义的抽取运算符(>>)能够从输入流中抽取信息 Cin和cout都是智能对象,能够根据程序上下文将信息 ...
- 二、CSS选择器
1.CSS派生选择器 概念:通过依据元素在其位置的上下文关系来定义样式. 实例: <!--index.html--> <!DOCTYPE html> <html lang ...
- python-web微信实现
1.url from django.conf.urls import url from django.contrib import admin from web import views urlpat ...
- pyton unittest
在说unittest之前,先说几个概念: TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoader是用来加载TestCase到Test ...
- 【产品设计】【转】APP界面设计规范编写指南(人人都是产品经理)
转自 :http://www.woshipm.com/ucd/608557.html 作者:EID_UX_DESIGN,微信公众号:EID_center 原文地址:http://www.ui.cn/d ...
