yzwalkman

——用数绘画

导航

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中。

 

 

      

posted on 2012-12-21 21:39  yzwalkman  阅读(1031)  评论(0编辑  收藏  举报