Ogre源代码浅析——Archive对象

来源:互联网 发布:淘宝新会员免费注册 编辑:程序博客网 时间:2024/05/01 22:44

Ogre源代码浅析——Archive对象

      3D图形渲染引擎所需的外部资源,根据其作用可分为纹理、模型、骨骼动画、材质数据等多种类型。这些资源一般都以不同格式的文件形式保存在外部存储器上。Ogre在处理这些不同结构的资源文件时,又根据文件形态将其分为两大类——普通文件和压缩文件。在加载外部资源文件资源时,由于不同形态的文件后期处理的方式不同,所以要在加载之前就对其进行相应的区分。Ogre引入的Archive类可以达到这一目的。

      Archive类有三个成员变量:

protected:
    /// Archive name
    String mName;
 
    /// Archive type code
    String mType;
 
    /// Read-only flag
    bool mReadOnly;

  Archive主要对应着各资源文件所在目录,其中mName用来保存目录字符串,即保存在同一目录下的资源文件有着相同的mName,对应着同一个Archive类对象;mType变量表示当前目录下保存的资源文件是普通文件还是压缩文件;mReadOnly变量用来表示当前目录是只读的还是可读写的。Archive有两个派生类——FileSystemArchive和ZipArchive,它们分别对应着普通资源目录和压缩资源。下面以FileSystemArchive为例来讨论一下Archive对象的运行机制。

     Ogre是通过ArchiveManager类对象来创建和管理Archive类对象的。

     ArchiveManager对象有以下两个成员变量:

protected:
       typedef map<String, ArchiveFactory*>::type ArchiveFactoryMap;
       /// Factories available to create archives, indexed by archive type (String identifier e.g. 'Zip')
       ArchiveFactoryMap mArchFactories;
       /// Currently loaded archives
       typedef map<String, Archive*>::type ArchiveMap;
       ArchiveMap mArchives;

  Ogre采用抽象工厂(Abstract Factory)模式,生成了ArchiveFactory的两个派生类FileSystemArchiveFactory和ZipArchiveFactory的实例对象,并将其保存在mArchFactories中。在Archive* ArchiveManager::load( const String& filename, const String& archiveType)方法被调用时,ArchiveManager会根据第二个参数archiveType找到相应的工厂对象实例,并调用相应工厂对象的createInstance方法,生成对应的Archive对象。FileSystemArchiveFactory将生成FileSystemArchive类对象,它的mName值是由外部(在.cfg配制文件中设定)传入的;mType值由FileSystemArchiveFactory在创建FileSystemArchive对象时设定为“FileSystem”并传入;接下来ArchiveManager会在其load过程中调用FileSystemArchive的load方法,在FileSystemArchive的load方法中将试着对相应目录进行写操作,如果写操作失败则证明此目录为只读,从而将mReadOnly变量设为true,否则设为false。最后以Archive对象的路径字符串为key,将创建好的Archive对象保存在mArchives中。

 

 

      

作者:yzwalkman
出处:http://www.cnblogs.com/yzwalkman/
转载请注明出处。
0 0