Ogre源代码浅析——Archive对象

平平:在具体的加载各种资源文件前,对文件进行的读写。包括 普通文件(FileSystemArchive)和两种压缩文件(ZipArchive和EmbeddedZipArchive)。对应的工厂类有FileSystemArchiveFactory、ZipArchiveFactory和EmbeddedZipArchiveFactory(ogre1.9.0中)

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

转载自:https://www.cnblogs.com/yzwalkman/archive/2012/12/21/2828362.html

猜你喜欢

转载自blog.csdn.net/jean7155/article/details/85833969