優化HGE繪圖算法成功了


  HGE的核心繪圖算法真是問題多多
  大家有沒有發現HGE繪圖的時候是很有問題的。

  每畫一張圖片,就需要從系統內存復制一次數據,最關鍵的不是數據復制的問題,而是每一次都需要LOCK鎖定一次頂點緩沖區進行數據更新。鎖定的時候不使用任何標記,那么就強制GPU和CPU同步,帶來的是渲染延遲問題。

  最要命的是每一幀都進行從系統內存——顯卡內存的操作,如果是網絡游戲,每一幀都畫上千張以上的圖片和阿爾法混合,結果會出現什么??本來頂點緩沖區里面既然已經存在數據,那么在幾幀之內,如果數據是不需要更新,就完全可以直接從頂點緩沖區里面讀取數據進行繪圖。那么這些是GPU的事情,而CPU只是做了很短時間的操作。這種方式才是最合理的。而且我估計所有大型的網絡游戲都是采用這種處理方式。根本不可能像HGE那樣每一幀的操作。小型游戲是沒有所謂的。大型游戲肯定不行。

所以如果不修改繪圖算法,直接采用HGE原來的算法進行游戲開發,那么在大量的圖片在每一幀里面進行繪圖的時候,肯定會出現各種延遲現象和資源占用的問題。
  (關於頂點緩沖區鎖定操作等問題,網上關於D3D編程的資料非常多,如果不了解這些基礎的話,就很難理解了)
 
緩存——真正的意義是保存數據。這些對於有編程經驗的人來說,很容易明白它的意義,並且得到極大的利用這些緩存的好處。尤其是顯卡內存的緩存,對於存儲在里面的數據,肯定得到更快的渲染。
 
  而HGE原來的繪圖算法,完全沒有發揮頂點緩沖區和索引緩沖區的效能。就好像每一次都從系統內存復制入圖片,而沒有發揮顯卡內存資源池的效能那樣。如果像大型的3D網絡游戲那樣采用這種算法的話,每一次都從系統內存復制入萬級面數量的數據甚至是億以上的數據,(一個人物模型最少2000——3000面,采用索引緩沖區,一個面最少4個頂點),那樣不死機才怪。

  今晚剛剛修改完繪圖算法。
基本上,在游戲里面我們是不需要每一幀都更新數據的。如果人物跑動需要每一幀都更新的話,那么一秒的時間內,需要繪制多少個畫面,這個人可能不是在跑,而是在飛了。所以無論是人物移動或者釋放魔法攻擊這些變化都需要在某個時段內才更新不同的畫面。就是說,大部分時間內(毫秒級),繪制的畫面是相同的。這些相同的數據顯然只需要GPU讀取緩沖區原來的數據而直接繪制就行,不再需要從系統內存再鎖定復制數據。只有發出更新的命令后,才需要重新更新緩沖區的內容。這段時間內,CPU完全可以做其它邏輯上面的處理,這樣下一次需要更新的內容就提前做好了。等到更新的時間到了,再一次性復制到緩沖區里面,之后就由GPU來操作了。
 
  繪圖算法沒有采用HGE原來的架構,而是重新寫了渲染和邏輯添加數據函數,圖片繪制成功。只需要再細化優化一下就可以大量地批量渲染各種圖片數據了。
  目前圖片格式還是PNG的,這種格式的圖片壓縮空間已經不大。遲些再試試TGA格式的圖片,這種圖片是帶通道的。DDS圖片格式雖然可以具有很大的壓縮比,只是顏色失真也很厲害。BMP和JPG完全不需要考慮。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM