2007/03/31

[DirectX]圖形跳動


由於現在的案子是2D模式,當人物紙娃娃一多的時候,就需要許多的圖來使用,所以如果是一張張讀入記憶體時,就會浪費許多的空間。尤其是裝備的圖檔,空白的地方非常的多,在讀圖的同時也會讀入,所以就需要使用材質管理,來管理記錄使用非空白的部份。


以下是我的嘗試做的方法:


就把一張張畫面中所需要部份切割出來,去除不需要部份,再把許多切割出來的圖形,放在一張256x256的材質中。為什麼要256x256呢?因為在Directx最佳化的說明文件中,256x256讀入記憶體的速度最快的。
(同時依網友的回答中,DDS 也就是 DirectX 內建的格式,讀入速度也是最快的。因為不用壓縮、轉換,直接讀到記憶體中,但是同時 DDS 如果使用壓縮也是破壞性的壓縮,會影響到圖形的精美度,由於我們遊戲是2D當然不能使用破壞壓縮,但是這樣儲存出來的檔案也比原來的大上許多)。
然後在遊戲使用中時候在再依需要的圖形載入記憶體,這樣就會比全圖載入所使用的記憶體用量少許多,然後也會比一張張的圖形載入速度較快。


以下表列一下如何動作:



  1. 載入圖檔
  2. 記錄非空白區域
  3. 產生256x256材質記憶體
  4. 尋找空白位置,填入圖形資料
  5. 以上動作重複執行,直到處理完所有圖檔

原本在自已的電腦中,測試是沒有問題的,但是一使用美術的電腦的時候就會發生圖形跳動的問題。



後來發現在第2步中的記錄非空白區域時,如果邊寬長是奇數的話,在用DirectX繪圖時,圖形位置會不太正確,以至於在後來拼貼圖形時會產生跳動的情況。所以在記錄非空白的區域時,要將邊寬長放大至偶數,才不會產生跳動的情形。


可能是因為在材質繪製是使用比例去切割所需要圖形,當為奇數時可能切割的部份會有小誤差,設成偶數誤差就會比較少了。


後來Debug才發現,原來是底層的繪圖長寬使用RECT計算長寬時
長=RECT.left-RECT.right+1
寬=RECT.bottom-RECT.top+1
要+1才是正確的長寬度,以上修正之後,圖形就不會有跳動的問題,但是之前介面的部份沒有+1會正常顯示,現在+1之後圖形的上跟左都會多畫一條線,如果在設定繪圖範圍先-1,就會少畫下跟右的一條線,有點困擾中,到底+1是正確的嗎?

2008.08.15

之後上過課才知道,原來是內部的DirectX問題,只要在材質長寬加上0.5 就可以避免這個問題,有興趣的請參考DirectX的教學。

沒有留言: