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