資源相關,先來張外部呼叫介面的圖
文件裡有更具體的用法
遊戲基本都是引擎+資源組成的,為了管理,資源一般都會打包,防止丟失容易管理
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...