很長時間以來,游戲產業不允許新的血液加入,因為每個職位都要求申請人有2年以上的經驗. 但是現在是加入游戲產業的最好的時機. 因為研發隊伍的急劇增長, 有經驗的人很難找了, 所以越來越多的公司從大學里招人. 不管你上的是什么大學,你都有機會在游戲產業里找到一份工作. 你需要熟悉以下領域.
數學 - 對于視頻游戲開發,這個非常重要. 不,你不需要去記如何求一個繞x軸旋轉的曲面的表面積. 你需要有很好的線性代數技能. 如果你不知道點乘的公式(a dot b = a.x * b.x + a.y * b.y + a.z *b.z )和它的幾何意義( ¦a ¦ * ¦b ¦ * a和b夾角的余弦), 你是不可能獲得工作的. 你需要知道如何把一個向量投影到另一個向量上(a到 b的投影 = (a dotb)/ ¦b ¦^2* b) 以及一個平面上. 你需要知道向量積(叉乘)是什么(a x b = [a.y *b.z – a.z * b.y, a.z * b.x – a.x * b.z, a.x * b.y – a.y * b.x]),以及它的幾何意義(一個和兩個向量都垂直的向量,長度等于原來兩向量的長度乘以兩向量的夾角的正弦). 我記憶向量積公式的方法是把i,j,k 放在矩陣的第一行,然后是第一個向量,最后一行是第二個向量, 然后計算這個行列式. 如果你不知道什么是行列式或者如何計算一個行列式, 這可不是個好的信號! 你應該知道一個矩陣的逆以及如何計算,你應該知道如何轉置一個矩陣. 你應該知道什么是正交矩陣以及求它的逆的簡單方法(求它的轉置就行了). 熟悉各種坐標空間之間的轉換是很重要的. 碰撞檢測函數背后的數學原理也很需要學習. 你如何找到一條光線和另一條光線的碰撞點?一個平面呢?一個球面呢? 什么是四元數(quaternions)? 你如何對它們做一些常見的操作? 如果你的數學已經不那么熟了或者不知道如何開始, 我推薦 "3D Math Primer for Graphicsand Game Development".我讀過以后發現它很好地覆蓋了所有的基礎知識. 我沒有讀過別的書來做比較, 但是這本書肯定會給你打下很好地基礎,同時它也是很多游戲開發中常見數學運算的參考資料.
物理 - 你需要對各種拋物體的公式非常熟悉.如果你不能記住或推導出d = v0 * t + 0.5 * a * t^2, 你肯定會在面試或編程測試中遇上麻煩. 你應該能輕松解決任何涉及到拋物體和重力的問題.不論未知量是重力加速度, 發射角, y方向速度, xz方向速度, 時間,距離, 或其他任何可解的組合,你應該能沒有任何困難的求出解來.你應該熟悉彈性和非彈性碰撞下的動量和動能變化. 滑動和摩擦力也是你應該理解的概念.
C++ - 雖然一些地方還在用c多過c++,但是C++已經是游戲編程中向被廣泛接受的幾乎標準的語言. C++的知識是非常重要的.因為如果用的不好, 你會寫出非常糟糕的代碼.首先,你應該知道什么是虛函數,以及如何使用它. 理解虛函數表是如何工作的也同樣重要,這樣你就能夠理解當你調用虛函數時需要的額外步驟,這些步驟會降低性能(每個對象都有一個隱藏的虛函數表指針[具體在哪取決于編譯,并且對指針做類型轉換時,this會有變化],這樣調用一個虛函數,你需要根據這個指針找到那個函數表,然后跳到它所包含的函數指針所指的函數里,這會降低cache的效果). 知道如何有效地使用模板和操作符重載也很重要. 關于C++,好的OO設計是最重要的. 最常用的一些類層次很深而且很費解,你最后需要做可怕的虛擬繼承或者為一些不需要的變量浪費內存.
人工智能 - 我在大學里學習了標準的人工智能課程,但是這些東西沒有一點在游戲AI中是可接受的. 教的很多算法很難實現或者對游戲而言不現實. 你知道什么是有窮狀態機就夠了. 絕大部分游戲使用有窮狀態機, 而那些不用這個的游戲,使用的是簡單的基于規則的系統. "白與黑"(包括它的續集)是我能想到的唯一的使用了其他東西(神經網絡)的例外, 而且很多玩家對它的結果并不滿意. 如果你想找本書, 我推薦"AI Game Programming Wisdom 3". 里面有兩篇特別優秀的文章,一個是關于有趣的游戲AI設計,另一個是關于行為合成. 嚴肅的說,雖然書會很有幫助,但是學習游戲AI的最好的方法是實際做一個.
圖形學 - 這是一個重要的領域. 如果圖形是你的主要感興趣的方向,那么你應該知道的比這里說的多.但是,不論你想要在這個產業里做什么職位, 你應該知道一些基礎. 你需要知道什么是渲染狀態以及通常都有哪些渲染狀態?(cull, z write, ztest之類的).什么是標準的光照方程?(I =ka*Ia + Ii*(kd*(L dot N) + ks*(R dot V)^n) ). 材質映射是如何工作的?材質的wrapping和clamping有什么區別? 如何高效的渲染程序中一組幾何體?(按照渲染狀態組織你的幾何體,按照你的硬件最快的primitive分批,飯后發給圖形卡).你需要知道 skinning 是如何工作的. 如果你對書感興趣, 我推薦 "3D Computer Graphics". 這個不是專為游戲寫的,多以它包括了一些在游戲中不現實的技術.但是,我想一個總體的了解是有幫助的,而且,隨著游戲硬件的發展, 那些現在看來不現實的技術會變的普通的.
工具開發 - C# 看來在游戲業界獲得了不少地位.所以你也應該讓你熟悉一下C#.C#在加快工具的開發上表現出不少優勢.很多人說工具可以制造下一代的游戲, 我同意這一點. 擁有的工具越多,團隊花在可以被輕易自動化的工作上的時間就越少. 可能你的團隊有10個美工, 花程序員的一個人年來開發一個可以給美工每天省15分鐘的工具并不值得,但是如果你有50個美工,那這就肯定值得了.C#可以快速的創建GUI,而且和其他一些能簡化創建GUI的方法不同, 這些GUI很好理解和使用,因為他們是標準的windows組件,允許你方便的設定快捷鍵,就像其他Windows程序一樣. Visual Studio 里的Form Designer 真的很好用,而且C#的metadata和event驅動的設計使得工具的開發輕而易舉.你最好也對mfc有基本的了解,因為可能面試你的開發人員會有點落后與時代.如果你有興趣學習很多關于這些技術是如何工作的(這會讓你寫出更好的C#代碼),我強烈推薦"Applied Microsoft .NET Framework Programming",我在空閑的時候讀這本書,然后我就不能放下了.我一章一章不停的讀,因為我是那么激動的像學習下一章的話題了.記住, 這本書不會教你各種framework里的類和這些類是干嘛的.它講的是這個語言的核心機制,它是如何工作的. 這本書也不是專門為C#寫的. 它告訴了你如何用VB.net做一些在C#里不能做的是,它還提供了用MSIL(MicrosoftIntermediate Language, 所有.net語言的編譯器都會編譯出這種字節碼)寫的例子,實現一些不被任何一種.net語言支持的功能.
操作系統 - 雖然這個看起來和這個和游戲開發相對而言不是太相關, 但是我很高興我在大學學習了操作系統的課程,因為我經常會用到從這門課學到的知識. 關于操作系統的知識非常重要,因為它在幕后為程序處理著很多重要的工作.特別是由于下一代的游戲終端和雙核PC上的多核特性,多此案成的知識是至關重要的.對虛擬內存的了解當然是很有用的.關于文件系統,內核態和用戶態切換,分頁的知識對PC游戲開發更為有用, 不過隨著一代代的發展,終端也在變的越來越像PC.所以,知道這些東西沒有壞處.
編譯器 - 雖然知道如何寫一個分析器可能并不重要, 但重要的是知道你的代碼是如何編程匯編代碼的.這樣你就能明白如何寫出更優化的代碼.你顯然必須熟悉把你寫的程序變為可執行文件的4個步驟:預處理、編譯、匯編和鏈接. 編譯器如何處理常量的? 很好的理解宏和知道如何用它來簡化一些常用的操作是很重要的. 知道你正在用的編譯器的調用約定,因為參數超過一定數目的時候,會導致它們被放在棧上而不是在預留的寄存器里. 調用約定的知識在你用匯編寫函數的時候也是有用的.
這些只是一個作為一個游戲程序員,你應該具備的各種知識和技能的入門介紹. 對每個領域,根據你的工作類型,總會有更多的你需要學習的東西. 知道一些實際使用的知識之外的東西總是沒有壞處的.
================================================
這幾條中估計只有物理是程序員的弱點,根據我觀察,程序員中物理強的人很少。我很幸運,啊哈哈~~
C\C++\C#我都會,呵呵。起碼在計算機語言上困難不大。不過我很看好C\C++,C#.NET運行太慢了。
我懷疑這個文章該不會是MS的人在宣傳他們的C#.NET吧 !!! ⊙_⊙ !!!