前言:游戲引擎,表面上看是一個工具,實質上卻是一本“技術圖譜”,每一個點擊行為的背后都有著其獨到的意義。每一個模塊都索引著數以萬行的工程代碼、數以百計的科研論文以及數以十計的專業書籍。學習引擎,其實就是一個修煉內功的過程,需要你不斷深挖里面的技術細節,找到對應的學習資料并消化理解。
游戲引擎,其實就是一套整合了各種游戲開發工具、封裝底層并提供程序函數庫的軟件系統。
游戲引擎架構系統分層
引擎技術固然復雜,但通過這些年的不斷迭代,大部分商業引擎已經擁有了非常完善的編輯系統、不錯的交互體驗、詳細的文檔以及豐富的開發功能,學習的門檻的降低也讓更多的崗位參與進來(進而誕生出了越來越多的獨立游戲)。下面列舉了游戲開發中常見的崗位 以及 兩條常見的協作開發的流水線:
其實學習游戲引擎,前期對于任何崗位來說路線都是相似的,基本上就是一個熟悉基本操作、理解基本概念、拓展專業知識的過程。但進入后期階段,程序員需要擁有更多的思考和知識儲備,需要從代碼層面理解并進一步達到能夠獨立編寫的境界。下面分享一下我近些年學習引擎的經驗,希望能夠幫助到你,
預備階段:引擎選擇,語言基礎,計算機基礎
Cocos、Cryengine、Unity、Unreal我都有接觸過,其實發展了這么多年各有適合的領域,當然也有不少值得詬病的地方。如果非要一句話說出來誰好誰壞是不現實的,也顯得很不負責任(其實每天都有人吐槽UE耦合的Gameplay、藍圖不好維護,吐槽Unity一堆半成品功能、資源加載慢、Mono低效等)。
在我看來,大部分人只要考慮學習引擎的成本,就業難度,發展方向就可以了,考慮目前市面上就業以及影響最廣泛的是Unity和Unreal,所以只推薦這兩個。
不過這兩個引擎一開始就給開發者出了道難題:我是學C#還是C++?
如果你是在校生,有時間慢慢學習,那么更推薦Unreal,開源代碼有更多的研究空間,C++學透了也是好處多多。
如果你是為了盡快找到一份工作或者快速出成品,Unity上手確實更快一些,C#也相對友好一點。
當然這不是絕對的,任何引擎的開始階段和大成階段都是相似的。但Unreal的學習曲線可能曲折一些(C++占了不小的因素),某一個階段的受挫很可能會影響到開發者學習的動力和進度。
不管怎么說,學習語言、看書都是必經之路,無論哪個方向都要沉下心來好好看一兩本經典書籍。比如C++,有《C++ Primer》《Effective C++》《C++語言的設計和演化》入門和拓展,進階有《C++Template》《深入探索C++對象模型》《More Effective C++》,虛幻引擎里面的C++是經過魔改的,如果你專注于寫游戲邏輯,確實用不到太多的C++特性,但考慮到未來的成長還是要盡可能深入。C#書籍,《C#圖解教程》《C#本質論》《C#高級教程》《深入理解C#》《CLR via C#》,如果是純小白,那么先只看一本,其他的慢慢消化。多說一句,語言的本質殊途同歸,真正的大佬也不會拘泥于某一個語言。
除了語言外,還有一個更重要的預備知識——計算機基礎。計算機基礎水平決定了你以后的發展速度和天花板(也是科班出身的優勢所在),所以強烈建議學好一門語言并持續性的鞏固操作系統、計算機網絡、數據結構和算法等專業知識。我一直后悔本科的時候并沒有吃透這些內容,所以工作的這些年來從來沒有停止過操作系統等知識的學習。這對很多人來說是一個漫長的過程,因此我們可以在后續的工作中慢慢鞏固。
關于這些知識的意義,比較直觀的例子就是他們通常能幫我解決各種疑難雜癥,比如:
遇到崩潰但是堆棧信息不準(匯編可以輔助我們定位)
本地能編譯通過,但是遠端編譯不過(可能是宏定義或者UnityBuild導致)
手機直接卡死,沒有任何堆棧信息(可能是內存問題)
字符串莫名的亂碼,Debug和Shipping版本表現不一致(編譯器優化問題)
這些問題在沒有融會貫通那些計算機基礎知識前是很難找到解決方案的
靠前階段:熟悉游戲開發,學習引擎編輯器的基本操作
如果你從來沒有接觸過任何引擎,也沒有相關的技術積累,那么無論你是做什么崗位都要放平心態,當做一普通的軟件去學習即可。這個階段的目的是熟悉引擎的基本操作,方法就是找一個入門教學視頻/入門書籍跟著做,遇到不懂直接去搜索引擎(或者官方文檔)上查,同時嘗試理解引擎中的一些基本概念,比如unity中的GameObject、Component、script或者Unreal中的actor、Component、藍圖等(一個月的時間足夠了)。很多大佬總是對教程或者視頻嗤之以鼻,但是在我看來,視頻教學確實是一個速度最快、理解起來最容易的方案。
如果你有一定的相關經驗和積累,可以跳過上面這一步,直接嘗試脫離教程進行Demo的編寫。注意不要急于一口氣把所有的Demo都做一遍,挑一個感興趣的方向并盡可能地去完善,你的收獲會更大的。比如做一個橫版跳躍,一個簡單的RPG或者ACT項目,不同的項目側重點都有所不同,可以提前大致了解一下。此外,脫離教程并不是脫離項目,教程(或者官方案例)里面的項目代碼、藍圖等還是有很大的參考意義的,自己在實現Demo的時候要多對比和借鑒,真正的理解其意圖才能更好的優化和改進。
Unreal和Unity的編輯器界面其實都很相似,觸類旁通
第二階段:補充游戲專業知識,理解基本原理
當你可以輕車熟路地配置一個Prefab,寫寫腳本或者能手到擒來地拉一個藍圖,實現一個Demo后,就不要甘心再當一名熟練工了。接下來我們需要開始補充相關專業知識,盡量理解你常用的每一個模塊以及每一個資源背后的意義。
當你將一個Prefab拖入場景時或是當你打開一個藍圖時,不妨思考一下他到底是個什么東西?為什么模型分為靜態模型和骨骼模型,而不是動態模型?為什么骨骼模型的外表叫做蒙皮?
這個階段你可以配合官方文檔去索引相關的技術概念,比如動畫系統里面的IK、Montage(蒙太奇)、BlendSpace、骨骼動畫、蒙皮動畫,然后就能通過這些概念到網上搜索相關的書籍、論文、視頻等等。如此往復拓展,你的知識圖譜會迅速被打開并充實起來。
動畫系統的書籍有哪些——《Character Animation With Direct3D》
動畫系統一般包含哪些技術—— 骨骼蒙皮動畫、Morp***、狀態機、Ragdoll、Root Motion、IK
骨骼蒙皮的技術原理—— Mesh按照權重綁定到骨骼上進行遞歸移動
動畫系統有哪些前沿的技術——Motion Capture、Motion Match、Path Warpping等
(其他模塊類似,時間充裕的話建議系統的學習并整理該模塊相關的知識)
此外,你應該再次打開工程項目和引擎,開始嘗試深入看一些成熟項目(引擎)的代碼。在理解了一些專業的概念后,最好去代碼里面再去看一下他的實現方式,這時候你的理解會比靠前階段更加深刻。比如一個組件是如何掛到對象上并生效的?動畫藍圖本質上是一個什么東西?這些動畫數據是如何傳遞的?這個時候你就可以嘗試性的梳理和分析源碼,逐個的解決你的問題。這里建議合理利用堆棧信息、畫圖工具、斷點調試等手段進行輔助。
這個階段其實比較艱難,除了專業知識外你還會遇到各個方面的難題。比如數學物理基礎、語言特性、系統原理、編譯調試方法以及各種Bug,一個一個攻破。
上面這些并不是只針對程序的,其實作為一名合格的策劃/美術,即使不看源碼至少也需要把官方文檔研究透徹,通過一些視頻或者書籍理解部分系統的基本原理。只有真正的理解了這些,你才會真實的感受到自己的進步和成長,以后在面對這些系統的時候也會更加游刃有余。
不過考慮到現代引擎如此的復雜和龐大,有必要逐個模塊去學習么?答案是否定的,畢竟人的精力有限。即使我已經接觸引擎5年了,還是有很多模塊幾乎沒有碰過,不是說他不重要,而是他不在我的規劃目標之內。所以要自己規劃發展方向和感興趣的內容,然后再進行相關資料的查閱和學習。
第三階段:代碼修煉(針對程序員)
這階段的已經對引擎的某些模塊有了專業的理解和思考,下一步就是動手去使用和完善。這個時候光看書籍和資料已經不夠了,需要去看相關的源碼或者Demo來加深理解,并嘗試寫一些復雜的代碼模塊。這一步其實和第二步是相輔相成的,你在查閱各種資料的同時,就可以動起手來仿寫一些相關的代碼并根據自己的需求進行拓展。
比如說你通過書籍《網絡多人游戲架構與編程》理解了什么是幀同步和狀態同步,那么在當前的引擎中使用的是什么方式?能否轉換成另一種方式呢?難點都有哪些?你可能需要下面的能力
計算機網絡基礎知識
TCP/UDP Socket編程
序列化的實現和應用
理解引擎Tick和各個模塊的更新邏輯
C++一些常見的語言技巧
操作系統內存知識
復雜模型的抽象能力
再比如,你了解了AI中基本的尋路算法和行為樹概念,你知道引擎里面是如何實現的么?A*算法在引擎里面有集成么?一個復雜的場景如何拆成格子類似來應用A*呢?能不能自己寫一個簡易的行為樹呢?這些都是我們在學習引擎以及拓展開思路后需要思考和解決的問題。
在編寫這些代碼的時候,你會遇到各種各樣的問題,不僅是對編程能力的鍛煉也是對你個人編程素養以及計算機素養的提升,以往許多看起來高端且理解不夠透徹的知識點也會逐漸被消化和關聯起來,比如內存池以及內存管理、無鎖編程、異步編程、Hook技術、游戲安全等。
另一方面,我們的大腦會不斷地對其進行抽象,引擎的代碼結構也會逐漸變得清晰,漸漸的我們就可以真正地理解模塊的結構和意義。當然,平時如果保持一個畫圖分析、寫筆記總結的習慣,這個過程會更順利一些。
個人繪制的一些架構圖
個人的一些筆記目錄
第四階段:脫離引擎(針對程序員)
這個階段已經基本脫離引擎了,我們更多的是從程序的角度思考架構與實現方式,思考如何將更先進的理論思想(包括架構方式和專業的論文知識)應用到我們的環境中來。你可以嘗試看不同的引擎源碼,參考不同的開源項目與論文,開始對比不同引擎的優劣并嘗試自己實現與優化,不斷磨練自己編碼能力的同時,也在深入著某個方向的專業能力以及架構能力。慢慢地,你會擁有屬于自己的一套思考理論(比如我習慣先跑流程,梳理概念然后關注數據存儲方式),可能打開一個引擎源碼就能猜到哪些模塊是干什么的,它的結構大致是什么樣子的,運行時類型怎么獲取、資源的管理方式是什么、GC的方式是什么、Tick更新的順序是什么、多線程如何進行封裝與應用等等,這時候他是Unity還是Unreal對你個人的技術來說似乎沒有太大的差別了。
不過,你依然很難做到游戲開發領域全方向的專家,換一個方向可能還需要重新走一遍相似的路(當然會快很多)。另一方面,每一個領域的技術也一直在推進著,科研界從沒有停止過論文的產出(比如每年的siggraph,近些年深度學習與游戲AI的結合),工業界也從來不會放慢對新技術投入生產的腳步(比如DX12、Vulkan的推進),我們的學習仍不能止步。
以上就是我關于引擎學習的一些經驗分享。當然最后一個階段某種程度上已經超過我的能力范疇,算是我后續發展的一個方向吧??偟膩碚f,多思考、多提問、多查資料、多寫代碼、多總結,只要堅持下去每個人都可以成為一名出色的/卓越的/優異的/杰出的的開發者。
作者:Jerish
來源:游戲開發那些事
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
余額寶歷史收益率怎么計算?余額寶的收益計算方法有兩種:1、根據萬份收益計算萬份收益就是購買1萬元每天能賺多少錢,如萬份收益為0.6,代表購買1萬元余額寶每天收益為0.6元。2、根據近7日年化收益率計算年化收益率就是假設你持有一年的預期收益率,如年化收益率為2%,代表購買1萬元余額寶持有一年的收益為200元,那么每天就是0.54元。余額寶怎樣轉換7日年化利率?余額寶的7日年化收益率可以通過余額寶的頁...
(相關資料圖)提起x360手柄怎么在電腦上用大家在熟悉不過了,被越來越多的人所熟知,那你知道x360手柄怎么在電腦上用嗎?快和小編一起去了解一下吧!將手柄無線接收器,插入電腦,電腦會自動安裝好驅動,然后手柄的綠燈將會亮起;接著打開手柄電源,然后按下接收器器上的一個小按鈕。接著再按手柄上側面上的一個小按鈕,你就會看到西瓜鍵此時在轉圈,等兩三秒然后手柄上的綠燈常亮了就表示匹對成功了,然后就代表手柄可以...
電匯多久到賬?國內電匯和跨境電匯的到賬時間不一樣。一般國內同行電匯實時到賬,同城跨行電匯也比較快,一般在半小時以內??缧须妳R到賬時間較長,一般在三個工作日內,節假日不計入工作日??缇畴妳R到賬時間相對較長,一般需要3-7天。電匯是什么意思?電匯是一種匯兌結算方式,是匯款入將一定款項交存匯款銀行,匯款銀行通過電報或電傳給目的地的分行或代理行(匯入行),指示匯入行向收款人支付一定金額的一種匯款方式??梢?..