yzwalkman

——用数绘画

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

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   yzwalkman  阅读(1039)  评论(0编辑  收藏  举报

点击右上角即可分享
微信分享提示