zoukankan      html  css  js  c++  java
  • 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
    转载请注明出处。
  • 相关阅读:
    JDBC之Statement 接口的测试(存在sql注入风险)
    Java操作数据库之JDBC增删改查
    Java实体类之间的映射(一对多关系)
    Java实体类之间的映射(一对一关系)
    yield(放弃、谦逊、礼让)
    daemon(守护、服务员)-t1.setDaemon(true)
    join当前线程等待指定的线程结束后才能继续运行
    检查你要加入到gradle的第三方library是否是最新版本
    git 无法忽略Android Studio 生成的 .idea目录解决办法
    mybatis3 step by step 快速上手
  • 原文地址:https://www.cnblogs.com/yzwalkman/p/2828362.html
Copyright © 2011-2022 走看看