• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            清源游民  gameogre@gmail.com

            資源組
            命名組可以作為一個整體加載與卸載。在加載,卸載,初始化時把把組中的所有資源作為一個執行單位來
            看待,而不是逐個進行處理。資源組管理純粹是了為了管理上的方便,是否使用組的方式與性能無關。假
            如向資源組管理器中加入了資源位置而沒有指定組名,那么這些資源位置被放入"General"組中。
            資源組與世界幾何
            缺省情況下,ogre把加載的世界幾何放入"General"組。也可以覆蓋(override)這種方式,使得對世界幾何的管理像其他資源的管理方式一樣。統一的場景管理器可以提供關于裝載世界總步驟的線索,這樣就可以在關卡加載時,提供精確的以進度條顯示的反饋信息。
            資源位置(location)
            資源位置是ogre去查找資源進行索引的地方。索引指的是在某個位置的所有資源通過它們的名字被映射,這樣可以方便進行更快的查找資源。可以在程序的任何時候添加或刪除資源位置,不必事先對所以可能用到的進行定義。資源位置在ogre中實際上是個archive,它的意思就是“文件的集合”。磁盤上的文件系統是
            archive的一種類型。另外一種是zip archive。可以自定義archive格式。這通過改寫archive類實現來完成,必須支持對命名的leaf文件進行枚舉操作,必須支持通配符,支持結點遞歸,給ogre提供一個流訪問archive中文件的數據。ogre中的archive是只讀的。ogre資源管理器利用archive枚舉特性來索引archive的內容,當ogre對archive進行索引時,不會實際加載任何資源。
            資源生命周期
            資源有四種狀態,各狀態之間的轉換關系如下圖:

            Undefined:這是程序開始時,所有資源的缺省狀態。除非它們被聲明,ogre對程序用到的資源一無所知,手工調用代碼 ResourceGroupManager::declareResource()或在腳本中被解析之后,資源的狀態變為Declared
            Declared:聲明就是告訴ogre想要加載某些資源。ResourceGroupManager::declareResource()總是有效的,包括在渲染系統初始之前,這與ResourceManager::create()不同,因為后者依賴于渲染系統。
            Unloaded:通過調用ResourceGroupManager::initialiseAllResourceGroup(), ResourceGroupManager::
            initialiseResourceGroup(),或Root::initialise()(它會初始化在此調用之前所有聲明的資源),資源狀態進入到Unloaded,資源會占用一點內存來保存它的定義的實例,但是資源本身還沒有加載到內存。從另一角度看(從Loaded到Unloaded),引起狀態變化的調用有:ResourceManager::unload(),ResourceManager::unloadAll(), ResourceManager::unloadAllUnreferencedResources(),ResourceGroupManager::unloadResourceGroup(), or Resource::unload().所有這些調用仍會保存資源實例,但真正的資源數據會從內存中卸載。
            Loaded: 這種狀態下,所有數據都變得有效。與此狀態有關的調用有Resource::load(), Resource::reload(),
            ResourceManager::load(), ResourceManager::reload(), ResourceManager::reloadAll(),
            ResourceManager::reloadAllUnreferencedResources(), and ResourceGroupManager::
            loadResourceGroup().
            邏輯資源管理
            資源以命名組的形式組織,每組可以包括任何類型的資源,每種資源都有自己的資源管理器,后者負責加載與卸載特定類型的資源。ogre對它的資源沒有實現特定的內存管理方案,如果你需要對某種資源實“最近最少使用算法”方案來進行管理,那么需要自己的代碼來實現。值的一提的是,現在的大多數顯卡驅動,對于大多數重要的資源已經實現了這種LRU算法管理。
            資源加載
            假如沒有預加載,當資源被訪問時會進行加載。實際的加載,卸載是資源自己的責任。
            手動加載資源
            資源管理層不負責實際的加載與卸載。通常,不必擔心資源是否存在于易失性媒介。然而,手工方式時需要考慮。手工資源加載器必須在任何時候準備好重新加載資源。假如某個資源是通過程序生成的,那么手工資源加載器必須內存中緩沖這些資源,或者是當資源管理加載時重新創建它。ogre認為手工加載與自動加載沒有區別。
            后臺資源管理
            缺省,ogre不是線程安全的。假如在OgreConfig.h中 #define OGRE_THREAD_SUPPORT 1 ,那么資源管理
            代碼的線程同步功能變得有效,我們就可以在包含Root實例的線程之外,開啟新的線程對資源管理類與方法進行操作,從而實現靈活的資源加載方案。 
            非后臺資源管理
            Ogre中大量使用了Observer模式,資源管理系統也不例外。ResourceGroupListene 回調接口包含了幾個方法
            允許對資源加載過程進行細粒度的監聽。
            資源卸載
            資源被加載后總存在于內存中,直到被應用程序強行卸載(通過資源組管理器或是被資源直接釋放)。資源管理組管理會把組中所有的資源都卸載掉。在資源被引用時不能強行卸載。
            Resource Locations
            // 配置文件方式
            ConfigFile cf;
            cf.load("resources.cfg");
            // Go through all sections & settings in the file
            ConfigFile::SectionIterator seci = cf.getSectionIterator();
            String secName, typeName, archName;
            while (seci.hasMoreElements())
            {
            secName = seci.peekNextKey();
            ConfigFile::SettingsMultiMap *settings = seci.getNext();
            ConfigFile::SettingsMultiMap::iterator i;
            for (i = settings->begin(); i != settings->end(); ++i)
            {
            typeName = i->first;
            archName = i->second;
            ResourceGroupManager::getSingleton().addResourceLocation(
            archName, typeName, secName);
            }
            }
            //硬編碼方式
            ResourceGroupManager *rgm = ResourceGroupManager::getSingletonPtr();
            rgm->addResourceLocation("../../media/packs/OgreCore.zip", "Zip", "Bootstrap");
            rgm->addResourceLocation("../../media", "FileSystem", "General");
            rgm->addResourceLocation("../../media/fonts", "FileSystem", "General");

            初始化
            在初始化之前,必須創建至少一個渲染窗口。因為在分析腳本時可能會創建GPU資源,而后者需要渲染
            上下文。
            // initialize all of the previously defined resource groups
            ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
            // or, alternately, initialize the defined resource groups one at a time
            ResourceGroupManager::getSingleton().initialiseResourceGroup("General");
            ResourceGroupManager::getSingleton().initialiseResourceGroup("Bootstrap");
            卸載
            可以在任何時候卸載資源(以組或單個的方式),正在使用的資源不會被卸載。
            以組的方式卸載
            ResourceGroupManager::getSingleton().unloadResourceGroup("Bootstrap", true);
            ResourceGroupManager::getSingleton().
            unloadUnreferencedResourcesInGroup("Bootstrap", true);
            true表示只卸載資源數據,不刪除資源實例,它可以被reloaded。有些資源在創建時被標為
            "nonreloadable",這種類型的資源不能使用上述方法卸載。
            清理或銷毀資源組
            清理僅是卸載資源與分離資源索引,銷毀不僅做清理的工作,還包括從資源組中把自己移除。
            ResourceGroupManager::geSingleton().clearResourceGroup("Bootstrap");
            ResourceGroupManager::geSingleton().destroyResourceGroup("Bootstrap");
            以個體方式卸載
            // assume that pEntity is a valid pointer to an instance of Entity
            MeshPtr meshPtr = pEntity->getMesh();
            meshPtr->unload();
            加載/重載資源組
            ResourceGroupManager::getSingleton().loadResourceGroup("Bootstrap", false, true)
            二個布爾變量不同資源類型資源加載開關,一針對"Normal"資源,二針對"World geometry"
            資源組加載通知
            class LoadingProgressListener :?public ResourceGroupListener
            {
            ?? public:?
            ???????
            ?// fired when a group begins parsing scripts
            ??????????????? void resourceGroupScriptingStarted(const String& groupName,
            ??????????????????????????????????????????????????????????????????????? size_t scriptCount) {}
            ?????? // fired when a script is about to be parsed
            ?????????????? void scriptParseStarted(const String& scriptName) {}
            ??? ?? // fired when the script has been parsed
            ?????????????? void scriptParseEnded() {}
            ???? ? // fired when all scripts in the group have been parsed
            ????????????? void resourceGroupScriptingEnded(const String& groupName) {}
            ????? //還有一些接口
            }
            //實現之后,進行注冊
            LoadingProgressListener listener(m_progressMeter);
            ResourceGroupManager::getSingleton().addResourceGroupListener(&listener);

            posted on 2007-03-14 17:09 清源游民 閱讀(2992) 評論(2)  編輯 收藏 引用 所屬分類: OGRE

            FeedBack:
            # re: 《Pro Ogre 3D Programming》 讀書筆記 之 第七章 資源管理 第一部分
            2007-03-15 16:43 | 夢在天涯
            非常好,感謝!  回復  更多評論
              
            # re: 《Pro Ogre 3D Programming》 讀書筆記 之 第七章 資源管理 第一部分
            2007-03-15 16:44 | 夢在天涯
            我的msn:mzty999@hotmail.com  回復  更多評論
              
            <2007年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            留言簿(35)

            隨筆分類(78)

            隨筆檔案(74)

            文章檔案(5)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久久久久福利漫画 | 国产成人无码精品久久久性色| 亚洲国产成人久久综合碰碰动漫3d| 国产亚洲美女精品久久久2020| 亚洲国产成人精品无码久久久久久综合 | 亚洲级αV无码毛片久久精品| 久久午夜免费视频| 日产久久强奸免费的看| 久久精品国产亚洲精品| 久久久久综合国产欧美一区二区| 国内精品久久久久久久coent| 亚洲狠狠久久综合一区77777| 99久久精品午夜一区二区| 丰满少妇人妻久久久久久| 久久精品国产亚洲av高清漫画| 亚洲∧v久久久无码精品| 色婷婷综合久久久久中文一区二区| 伊人久久大香线蕉亚洲| 久久综合久久自在自线精品自| 五月丁香综合激情六月久久| 色欲综合久久躁天天躁蜜桃| 嫩草伊人久久精品少妇AV| 99久久久国产精品免费无卡顿| 久久久青草青青亚洲国产免观| 99热热久久这里只有精品68| 精品久久久久久无码中文字幕 | 岛国搬运www久久| 狠狠综合久久综合中文88| 色综合久久88色综合天天 | 国产精品久久婷婷六月丁香| 亚洲中文字幕无码久久2020| 久久亚洲私人国产精品vA| 热久久这里只有精品| 久久人人爽人人爽人人片AV麻豆 | 欧美黑人又粗又大久久久| 精品蜜臀久久久久99网站| 91精品无码久久久久久五月天| 久久99精品久久久久久水蜜桃| 国产成人综合久久精品红| 久久精品国产亚洲AV无码娇色 | 精品久久久久久久无码|