ogre 引擎 框架追蹤 第三章 資源載入之虛載入

2021-07-24 23:17:13 字數 4894 閱讀 6941

前序 ogre 引擎 框架追蹤 第二章 初始化

前面兩章已經建立root、載入dll、建立渲染系統、建立渲染視窗。這章,我們該往整個框架裡塞東西了。ogre1.8用的單執行緒,不支援後台載入。關於資源的操作就是:

建立資源管理器->繼承不同資源管理器的建立->向資源管理器新增路徑->初始化已新增路徑的資源->載入資源->渲染資源。

前面兩步已經在前面實現,接下來的開始新增路徑。

ogre中有兩種方式實現路徑載入,一種傻瓜式載入,直接傳入乙個cfg檔名稱,解析了就把解析的資源目錄新增到資源管理器中,另一種就是手動新增,直接呼叫資源管理器向裡面新增資源。

第一種,傻瓜式的。

先看下resouce.cfg裡的內容

[essential] #資源分組名稱,這個裡面是ogre自帶的最基礎的資源

#這裡有traymanager裡所需的資源,包括overlay、滑鼠、字型

zip=../../media/packs/sdktrays.zip

zip=../../media/packs/profiler.zip

filesystem=../../media/thumbnails

# common sample resources needed by many of the samples.

# rarely used resources should be separately loaded by the

# samples which require them.

[popular]

filesystem=../../media/fonts

filesystem=../../media/materials/programs

filesystem=../../media/materials/scripts

filesystem=../../media/materials/textures

filesystem=../../media/materials/textures/nvidia

filesystem=../../media/models

filesystem=../../media/particle

filesystem=../../media/deferredshadingmedia

filesystem=../../media/rtshaderlib

filesystem=../../media/rtshaderlib/materials

filesystem=../../media/materials/scripts/ssao

filesystem=../../media/materials/textures/ssao

zip=../../media/packs/cubemap.zip

zip=../../media/packs/cubemapsjs.zip

zip=../../media/packs/dragon.zip

zip=../../media/packs/fresneldemo.zip

zip=../../media/packs/ogretestmap.zip

zip=../../media/packs/ogredance.zip

zip=../../media/packs/sinbad.zip

zip=../../media/packs/skybox.zip

[general]

filesystem=../../media

# materials for visual tests

[tests]

filesystem=../../media/../../tests/media

[popular]

zip=../../media/packs/nxogre.zip

結構上就是:

[分組組名]

zip=**.zip #zip檔案目錄

filesystem=** #資料夾

void renderscene::setupresources(ogre::string cfgfile)

}}

.cfg檔案的解析,最終的實現:

std:

:ifstream fp;

//always open in binary mode

fp.open(filename.c_str(), std:

:ios

::in | std:

:ios

::binary);

if(!fp)

ogre_except(

exception::err_file_not_found, "'" + filename + "' file not found!", "configfile::load" );

//wrap as a stream,轉換成ogredatastream,**不難,就是用windows的方法獲取大小,再用模板類轉換成datasteam,可以自己看。

datastreamptr stream(ogre_new

filestreamdatastream(filename, &fp, false));

load(stream, separators, trimwhitespace);//繼續,根兒上的解析

根兒上的解析

void configfile::load(const datastreamptr& stream, const

string& separators,

bool trimwhitespace)

else

}else

//不是組名的新增到當前組中

currentsettings->insert(settingsmultimap::value_type(optname, optval));//當前組中新增name和value}}

}}

}

解析出的資訊通過addresourcelocation新增到資源管理器中,新增過程:

獲取resoucegroup->有則獲取無則建立->檔案管理器載入

//獲取group

resourcegroup* grp = getresourcegroup(resgroup);

if (!grp)

//鎖資源分組

ogre_lock_mutex(grp->ogre_auto_mutex_name) // lock group mutex

// get archive

archive* parch = archivemanager::getsingleton().load( name, loctype );

// add to location list

resourcelocation* loc = ogre_new_t(resourcelocation, memcategory_resource);

loc->archive = parch;

loc->recursive = recursive;

grp->locationlist.push_back(loc);

// index resources

stringvectorptr vec = parch->find("*", recursive);//獲取檔案路徑中所有檔案

for( stringvector::iterator it = vec->begin(); it != vec->end(); ++it )

grp->addtoindex(*it, parch);//通過檔名儲存archive。已判斷資源存在不存在、檔案物件是啥等等。

先解析archivemanager::getsingleton().load這個函式,實現由註冊的檔案工廠(檔案型別)根據檔案路徑建立檔案並載入

其中核心**:

archivefactorymap::iterator it = marchfactories.find(archivetype);//前面root建立時我們已經註冊過filesystemarchivefactory、ziparchivefactory、embeddedziparchivefactory

if (it == marchfactories.end())

。。。//沒找到就報錯。

parch = it->second->createinstance(filename);//建立檔案物件

parch->load(); //載入

marchives[filename]

= parch;

其中filesystemarchive的load**如下

ogre_lock_auto_mutex

string testpath = concatenate_path(mname, "__testwrite.ogre");

std::ofstream writestream;

writestream.open(testpath.c_str());

if (writestream.fail())

mreadonly =

true;

else

我的媽呀,發現裡面就是虛晃一槍,就是檢查了下路徑存在不存在,是不是唯讀,別的啥也沒幹啊

再看下ziparchive的load

ogre_lock_auto_mutex

if (!mzzipdir)

mfilelist.push_back(info);//新增zip中的內容到zip archive的檔案列表中

}}

zip的倒是幹了點事兒,那就是讀取zip中檔案列表並儲存,以備後期真正的載入。

在虛載入之後,就是把路徑中所有檔案及對應的archive物件儲存,以備後面使用。

第三章 工具和資源

第三章 工具和資源 技巧33 熟悉ping實用工具 1 ping 得名於潛艇聲吶的發生,沒有相關的知名埠 把自己的程序id放在identifier欄位中,便於區分屬於自己的響應,相當於埠號的作用 rtt波動意味著網路負載的變化 技巧34 學習使用tcpdump或類似的工具 1 使用 不帶引數,抓取並...

第三章 表單和框架

1 表單 表單用於跳轉頁面,並且將表單中的元素的值提交給對應的跳轉頁面 method 的post 和 get 的 差異 1 get將表單元素值封裝置url中進行提交,post將表單元素的值封裝至http協議中提交,因此post比get更安全。2 url根據不同瀏覽器,所規範的長度略有不同,一般而言,...

第三章 MFC框架程式剖析

mfc中類名以字母c開頭,然後加上工程名,再加上字尾。它們caboutdlg,cmainfram,ctestview分別派生於 cdialog,cframewnd,cview,而這三個派生於cwnd類 設計和註冊視窗類 視窗類的註冊 是由afxenddeferregisterclass函式完成的,該...