HGE 原始碼分析 10 resource

2021-06-18 23:50:32 字數 4047 閱讀 5575

資源相關,先來張外部呼叫介面的圖

文件裡有更具體的用法   

遊戲基本都是引擎+資源組成的,為了管理,資源一般都會打包,防止丟失容易管理

bool call hge_impl::resource_attachpack(const char *filename, const char *password)

zip=unzopen(szname);

if(!zip) return false;

unzclose(zip);

resitem=new cresourcelist;

strcpy(resitem->filename, szname);

if(password) strcpy(resitem->password, password);

else resitem->password[0]=0;

resitem->next=res;

res=resitem;

return true;

}

附加乙個包到資源列表,並不是把資源載入記憶體了,只是把包放在資源列表裡

裡面會有乙個檢測操作,檢測這個包裡是有檔案的,unzopen後返回指向第乙個資源的控制代碼

void call hge_impl::resource_removepack(const char *filename)

resprev=resitem;

resitem=resitem->next;

}}

去掉附加的包~,遍歷列表刪除節點就行

void call hge_impl::resource_removeallpacks()

res=0;

}

去掉所有附加的包,直接清空了資源列表

void* call hge_impl::resource_load(const char *filename, dword *size)

// '/'和'\'轉化,本身在windows裡沒有區別,都可以表示路徑

while(resitem)

//在轉一下 \和/

if(!strcmp(szname,szzipname))//驗證是不是要載入的檔案

ptr = malloc(file_info.uncompressed_size);//分配記憶體,資源未壓縮的大小

if(!ptr)

if(unzreadcurrentfile(zip, ptr, file_info.uncompressed_size) < 0)//讀出檔案,成功後返回0

unzclosecurrentfile(zip);

unzclose(zip);

if(size) *size=file_info.uncompressed_size;

return ptr;

}done=unzgotonextfile(zip);//不是的話控制代碼後移繼續找

} unzclose(zip);

resitem=resitem->next;

} // load from file 直接讀乙個檔案

_fromfile:

//過程和上面差不多,只不過用windows的介面直接讀取了,獲取的也是檔案控制代碼

hf = createfile(resource_makepath(filename), generic_read, file_share_read, null, open_existing, file_attribute_normal | file_flag_random_access, null);

if(hf == invalid_handle_value)

file_info.uncompressed_size = getfilesize(hf, null);

ptr = malloc(file_info.uncompressed_size);

if(!ptr)

if(readfile(hf, ptr, file_info.uncompressed_size, &file_info.uncompressed_size, null ) == 0)

closehandle(hf);

if(size) *size=file_info.uncompressed_size;

return ptr;

}

把資源載入記憶體,兩種載入方式,一種是從包裡載入,會有類似解壓然後提取資源的操作

另一種是直接載入資源,從檔案載入(不在包內的)

成功後返回資源指標,並且通過引數傳出大小(size)資訊,指標是void的,需要大小資訊給它正確定址

void call hge_impl::resource_free(void *res)

釋放資源

char* call hge_impl::resource_makepath(const char *filename)

for(i=0; sztmpfilename[i]; i++)

return sztmpfilename;

}

生成完整的路徑

char* call hge_impl::resource_enumfiles(const char *wildcard)

hsearch=findfirstfile(resource_makepath(wildcard), &searchdata);//重新建立搜尋控制代碼,在資料夾下搜尋指定的檔案,searchdata儲存搜尋資訊

//vc裡還有乙個findfirstfileex函式,使用附加屬性搜尋

if(hsearch==invalid_handle_value) //無效返回值

//如果搜到的是資料夾,就繼續往下搜(遞迴呼叫空引數的函式),如果是檔案則返回檔名

if(!(searchdata.dwfileattributes & file_attribute_directory)) return searchdata.cfilename;

else return resource_enumfiles();

} else

if(!(searchdata.dwfileattributes & file_attribute_directory)) return searchdata.cfilename;

} }}char* call hge_impl::resource_enumfolders(const char *wildcard)

hsearch=findfirstfile(resource_makepath(wildcard), &searchdata);

if(hsearch==invalid_handle_value)

//搜的是資料夾,這個是檔案操作裡處理資料夾的統一操作,判斷屬性是資料夾,且檔名不是'.'和'..'

//這個很奇怪啊,三個點的也建不了資料夾。。。不明白為什麼都這樣寫

if((searchdata.dwfileattributes & file_attribute_directory) &&

strcmp(searchdata.cfilename,".") && strcmp(searchdata.cfilename,".."))

return searchdata.cfilename;

else return resource_enumfolders();

} else

if((searchdata.dwfileattributes & file_attribute_directory) &&

strcmp(searchdata.cfilename,".") && strcmp(searchdata.cfilename,".."))

return searchdata.cfilename;

} }}

這兩個一起,乙個是找到指定路徑下的檔案,乙個是找資料夾,具體的注釋裡有寫

hge資源操作主要用zlib的庫,從包裡載入檔案。

HGE 原始碼分析 15 最後的timer

很短的一點點 float call hge impl timer gettime float call hge impl timer getdelta int call hge impl timer getfps 只有三個返回函式,這些值來自system,在其中被重新整理值,然後由這幾個函式返回 到...

hge原始碼注釋 1 hge引擎的啟動(1)

先寫一段最簡單的hge程式,然後結合它以及hge原始碼來分析hge是如何啟動的 include hge.h 包含hge標頭檔案 hge hge 0 建立乙個指向hge類的指標。bool renderfunc 繪製函式,程式開始後hge將不停呼叫它 bool framefunc 邏輯函式,程式開始後h...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...