textureCache中的等價路徑問題

2021-09-06 22:22:26 字數 1068 閱讀 2849

自己的引擎裡做了個簡單的textuecache,每次新建立乙個紋理,先到texturecache裡查詢有沒有路徑相同的,如果有就直接返回紋理,如果沒有載入建立紋理並將路徑快取起來。另外為了標準統一,我們可以規定路徑都轉化成全路徑(full path)再快取。

不過發現對於使用了返回父級符號 ../ 的路徑,這樣簡單處理是有問題的,比如 a/b/../x.png 和 a/c/../x.png 這兩個路徑,形式上不同,實際上卻是等價。為了解決這個問題,在做兩個全路徑比較時要先將兩個全路徑都轉成不帶 ../ 符號的形式再比較。下面**可用於臨時解決問題但未必完善:

bool ispathequal(const string&fullpath1,const string&fullpath2)elseelseelse//got pathdirect

return pathdirect;

當然,支援帶../路徑是一種選擇,另一種選擇是引擎直接規定根本不支援帶../的路徑,但若是如此則一定要對於使用者傳進來的路徑進行檢查,如果發現其中帶有/../或者開頭是../,則給出乙個assert fail中斷和錯誤提示,否則既接受帶../的輸入,又暗自裡將紋理載入n次,就坑了。

不知道cocos2dx裡的texturecache有沒有考慮這種情況,等有時間看下。

更新(2015-4-9):

剛才測試了一下,cocos2dx不會識別等價路徑:

texturecache::getinstance()->addimage("res/a.png");

texture2d*tex=texturecache::getinstance()->gettextureforkey("res/b/../a.png");

cout<<"tex:"《因此,如果在cocos2dx裡對紋理使用帶../的路徑是會悲劇的。

補充(2015-4-9):

還有一種藏得更深的悲劇情況,即可能你自己寫的路徑都不含../,但你用tiledmap生成的.tmx中卻含有../,這一點極易忽視。我把公司的cocos2dx專案中的.tmx檔案檢視了一遍,發現裡面還真有帶../的路徑,非常奇怪,多數路徑都是不帶../的,但卻有個別帶,是什麼原因導致tiledmap生成了帶../的路徑目前我也不知道。

emacs中etags等的使用

在windows下常用的源 檢視工具是source inside。在linux下我習慣用用etags gtags grep來檢視源 etags用於生成tags檔案來提供emacs快速瀏覽c c 源 它的最大作用就是能夠快速跳轉到函式定義 巨集定義 資料結構定義 全域性變數定義等。etags常常和fi...

shell中 0, 等的用法

表示傳遞給指令碼的個數 0 指令碼本身的名稱 當前shell的程序號 上乙個子程序的程序號 所有引數列表。如 用 括起來的情況 以 1 2 n 的形式輸出 所有引數。所有引數列表。如 用 括起來的情 況 以 1 2 n 的形式輸出所有引數。顯示最後命令的退出狀態,0 表示沒有錯誤 其它表示有錯誤 1...

C 中的cin 等使用

1 cin 2 cin.get 3 cin.getline 4 getline 5 gets 6 getchar 附 cin.ignore cin.get 跳過乙個字元,例如不想要的回車,空格等字元 1 cin 用法1 最基本,也是最常用的用法,輸入乙個數字 include using namesp...