2012-08-31 61 views
1

我一直試圖解析一個directx .x文件,而不使用directX API來只加載模型的幾何。我第一次嘗試使用C++流,但解析一個800Kb文件花了差不多3秒。所以我試圖用C I/O函數做同樣的事情,現在需要大約120毫秒。 問題是,使用DX API加載相同的文件需要相同或幾乎相同的時間,但它也加載了所有內容,而不僅僅是幾何圖形。所以我認爲解析器的效率很低,那只是加載幾何。使用我注意到的大部分時間花費在fscanf()上的剖析器,我用它來分析頂點和索引。我也嘗試在緩衝區中獲取每一行,然後使用sscanf,但時間相同。我沒有使用STL。 有關如何快速解析避免使用fscanf的任何建議?請不要說「使用另一個類似Assimp的圖書館」,因爲我自己想這樣做。 在此先感謝。C/C++快速3D模型解析

+0

如果Assimp或任何其他開源庫做了你想要的,分析它看看爲什麼它比你的代碼更快。 –

+0

感謝您的評論。我已經看了assimp的來源,但是作爲一個完整的加載庫,它很難找到代碼的相關部分。但我一定會再檢查一次,謝謝。 – denidare

回答

1

從掃描中分離讀取,例如,首先將整個文件讀入內存(或使用內存映射),然後使用sscanf或其他方法掃描(boost :: spirit,爲什麼不呢?)

+0

我試着將整個文件加載到內存緩衝區,然後用sscanf處理它,但是sscanf的速度和fscanf一樣慢。我可以改進嗎?我試圖寫我自己的字符串分析器,但它有點慢。我真的不知道DX API如何處理文件加載/解析。也許多線程? – denidare

+0

多線程不會在這裏工作,因爲沒有大批量的並行化。還有一件事要說明的是分析你的負載 - 你確定它是scanf,它佔用了大部分的CPU時間,而不是一些愚蠢的錯誤(例如,每個新元素的內存重新分配)? – Lyth

+0

不,內存分配僅針對初始緩衝區,頂點和索引數組,僅對每個文件執行一次。我用自定義解析+自定義atof()替換了scanf,這加快了這個過程。現在需要大約50ms來處理同一個文件。 – denidare