1. 程式人生 > >偶然發現的一篇相見很晚的文章:如何學好遊戲程式設計

偶然發現的一篇相見很晚的文章:如何學好遊戲程式設計

 2。遊戲程式設計所需要的基礎知識
 
 我這裡介紹下要做一個好的,稱職的,遊戲程式設計師所需要。學習就和蓋樓一樣,要想上層
建築牢固,你就要有堅實的基礎,我這裡介紹的基礎是你從事遊戲程式設計最基礎,基礎的不
能再基礎的東西。
 2。1 數學
 數學是遊戲中支柱,沒有了它,任何都不要談,在你編寫你遊戲的時候,你就會知道,世
界抽象成一堆數學是多麼的神奇,突然你會覺得以前枯燥無味的數學現在是一頓大餐,但
這個是霸王餐。國外人寫關於引擎方面書的人,都可以說是數學高手,他們理論和實踐都
很厲害,讓我崇拜的不得了。大學裡是你學好數學的最好機會,一定要弄明白它的現實意
義,任何理論都不是憑空出來的,它一定有現實基礎,這個現實基礎,就可以幫助你很好
理解這個理論。
 2。1。1高等數學——微積分理論
 在遊戲引擎中,很多遊戲特效都是通過微積分方程來解得的,高度模擬是現在遊戲的追求
,真實感越強就需要越多的計算量。極限,一元微積分,多元微積分,級數,微分方程等
等在遊戲圖形圖象和物理上都有明顯體現。有時一個碩士或者一個博士為了擬真一個效果
要花費幾個月或者幾年的時間,做為一個遊戲程式設計師,微積分到達什麼層次我很難給出定
義,但起碼如果別人給出了原理我們能看明白,並把它實現,我覺得就很可貴了。
 2。1。2線性代數和空間解析幾何
 在大學課本中,空間解析幾何是放在高等數學書裡面講的,但遊戲中,它和線性代數放到
一起我認為更加合適。線性代數所有知識都要掌握,在遊戲中它們比微積分體現的更淋漓
盡致,理解上我個人認為相對微積分更容易。
 空間解析幾何主要講向量,平面,線,體,這些東西並通過線形代數矩陣進行空間變換,
最後達到遊戲想要的目標。
 2。1。3四元數
 這個在大學裡面不學數學的,估計很少有人接觸,它也是來用來變換空間,理解起來不是
那麼容易,但最常用的就是用四元數來表示旋轉。
 我這裡只是一概而過,上面任何知識在遊戲中都有應用,但大學裡的數學不是為了遊戲而
開設的,所以和遊戲中用的數學在知識分列和講解上還是有很大差異,尤其是線性代數和
空間解析幾何,不用擔心,我在後面介紹給大家一些好的遊戲書籍,對大家學習遊戲程式設計
和有幫助的。
 2。2語言
 編寫遊戲c和c++是你首選,相對來講C++是你更應該掌握的。
 2。2。1 其他語言為什麼不是當今流行的編寫遊戲程式語言?
 VB,JAVA,C#,等等其他語言,並不是說它們不能做遊戲,它們能做,由於語言本身設計
機理的限制,只能做一些對遊戲速度要求低的遊戲,對於執行速度要求高的遊戲,它們被
判成死刑。當然這個也取決於硬體的發展,以前8bit FC遊戲都用
C語言
和彙編來寫,現在
由於硬體速度提高,用VB,JAVA,C#來寫這些遊戲執行也是可以的,例如現在興起的WebG
ame(網頁遊戲)。但如果你真想做遊戲的話,你一定想要了解現在最流行遊戲編寫,C和C+
+是你最好的選擇,也是你走上真正的遊戲程式設計道路的重要武器。
 2。2。2 C和C++應該選擇那一個?
 C和C++,這裡面我還要說一說,我個人更看好C++。大家都知道C是面向過程的,而C++是
面向物件的,雖然C++的面向物件特性還不是很完善,但出於對大型軟體設計上的考慮,因
為遊戲引擎是大的工程,框架設計遠遠要比程式設計重要,一般框架設計用面向物件方式更直
接,所以C++比C更有優越性性,而且如果你合理用好C++,並不見得C++比C速度慢。有時一
個軟體
架構
和軟體執行上問題,很難取捨,對於大應用程式來說,都是一點點犧牲速度來
獲得好的架構,是利大於弊的事情,這裡確實體現軟體工程的重要性質。
 2。3。3 彙編,很重要嗎?
 組合語言也是你要掌握的,你說你語言學的好,但卻不會彙編,是一個天大的笑話。現在
很少有彙編高手能寫出比編譯器優化出來的彙編程式碼執行效率要高,因為語言的不同,思
考問題的方式就會有不同,就象最早紙帶機上的原語言一樣(可計算性與計算複雜性就講
這東西)。如果遊戲都用匯編來寫,寫程式碼效率很低,所以我們都用高階語言來寫,同時
還要與底層有密切聯絡的,C和C++擔任大部分工作量。對於遊戲速度頻頸問題,有時我們
用C和C++即使優化很多,程式碼精簡很多,演算法也改良很多,但由於語言本身設計上問題,
和高效彙編來編寫還是有不同的,這時就要是彙編高手來做速度最快,記憶體和暫存器使用
最少彙編程式。所以彙編還是很重要的。
 2。3。4 其他CPU硬體指令
 這裡只是說 INTER 和 AMD CPU 都支援的指令集,也是最常用指令集。
 MMX和SSE SSE2是遊戲程式設計中最常用的指令集,這個指令集是 SIMD(single instructio
n multiple data),也就是單指令多資料流指令集,一個指令可以處理多個數據流運算。
彙編CPU指令,一個指令只能執行一個數據流運算。
 例如:
   彙編中
  ADD EAX,EBX
  這是一個加法指令,EAX,EBX是暫存器,是32位的。這個指令就是 EAX = EAX + EBX。
這個過程只有一個數據流相加。
  而SIMD思想是,如果現在有2個指令
  ADD EAX,EBX  
  ADD ECX,EDX 
  能不能讓他們一起執行?所以SIMD 指令提供這樣的功能,他用很大的暫存器,前一部分
裝EAX值,後一部分裝ECX值,再用一個暫存器,前一部分裝EBX,後一部分裝EDX.
  SIMD 暫存器分成2部分[1部分][2部分]