关于DNF的多媒体包NPK文件的那些事儿(5)- IMG文件里的指向型索引项(指向帧)的深度与有向环检测
IMG里的指向型索引項(指向幀)的描述和用途已經在前文講過。
當貼圖讀取到指向幀時,會順著該索引項的第二字節(linkTo)來尋找它所指向的其他幀,若該幀也是指向幀,則會繼續尋找,直至找到圖片幀。如下圖所示,第3、4幀的Link深度為1,直接指向第2幀;第6幀Link深度也為1,直接指向第5幀;而第8幀的Link深度為2,因為它指向了Link深度為1的第6幀,而最終指向了第5幀:
很明顯,DNF在讀取到指定幀號是,需要經過Link深度次查找,才能找到目標圖片幀。但有時候,會存在多個指向幀的指向方位構成一個有向環,如下圖的2、3、4幀;或者更簡單的一種特例,即指向幀指向自己,如下圖的第5幀,很明顯他們的Link的深度均為∞:
由于DNF自身不具備判斷指向幀所指向的幀的類型,也不具備直接計算每個幀號的Link深度的能力,因此當DNF讀取如上圖所示的2、3、4、5幀時,則會不斷地尋找下去,直至暴棧,其直接結果就是DNF出現錯誤并且閃退。因此任何一個IMG文件里的指向幀應避免構成一個有向環,或者更直接的,避免文件里出現指向幀指向指向幀的情形,而實際上,DNF官方包含的IMG文件Link的深度最大值為2。
檢測一個IMG文件里是否存在有向環,需要讀取這個IMG內所有幀的幀類型以及作為指向幀時的指向幀號,然后確定最大檢測深度N。其中最大檢測深度N是一個正整數,作為該幀是否為有效幀的一個標的,該算法可以采用遞歸。其中當最大檢測深度N=0時,始終返回無效幀,即-1;最大檢測深度N>0時,當幀為圖片幀時,該幀為有效幀,并返回自己的幀號;若該幀為指向幀,則返回N-1時,該幀的指向幀號對應的幀的結果(尤其地,當最大檢測深度為-1時,該幀若為指向幀則返回無效幀)。其相關代碼如下(因為有KOISHIAPI支持所以當偽碼看一下吧):
因此可以看出,若IMG文件里存在有向環,則最大檢測深度N無論取多高,有向環內的幀號均會返回-1。
下面偽代碼計算從女魔法師皮膚文件的提取第一個IMG文件進行試驗:
using namespace Koishi; int _tmain(int argc, _TCHAR* argv[]) {NPKobject no;no.loadFile("skin.npk");IMGobject io;no.IMGextract(0, io);int *s = new int[io.count];printf("檢測深度:1\n");for(int i = 0;i<io.count;i++){s[i] = io.linkFind(i, 1);}disp(s, io.count);printf("\n檢測深度:2\n");for(int i = 0;i<io.count;i++){s[i] = io.linkFind(i, 2);}disp(s, io.count);system("pause");return 0; }其實驗結果如下所示:
結論是當最大檢測深度為1時,可以看出存在若干值為-1的幀;當最大檢測深度為2時,這些幀均變為圖像幀,也就是說該IMG內的所有幀的Link的深度均不大于2,也就不存在有向環。
總結
以上是生活随笔為你收集整理的关于DNF的多媒体包NPK文件的那些事儿(5)- IMG文件里的指向型索引项(指向帧)的深度与有向环检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 带有变量的语句_【成都校区
- 下一篇: 简答题c语言文件操作顺序,计算机基础与程