電子遊戲是許多人喜好甚至沉迷的事情。尤爲對於程序員來講,開發遊戲是很多人最初學習編程的動力。在以前,我發過一些遊戲開發的教程和案例:python
遊戲開發也是學習編程的一個很好方式,代碼上的各類增長和改動會馬上有直觀的反饋,讓你的學習過程顯得不那麼枯燥。程序員
不過遊戲開發和通常編程初學時接觸的程序開發模式有必定的區別,剛上手可能很不適應。我發現網上的遊戲開發教程大可能是從某種語言或引擎的開發細節入手,而沒有一個提綱挈領式的總體介紹。做爲一個有很多年遊戲開發經驗的開發者,我今天就分享下這方面的經驗。面試
電子遊戲的原理其實和電影的原理是同樣的,都是利用人的「視覺暫留」和「似動現象」,使本來離散的靜止圖像,看起來是連續的動態效果。算法
這種翻頁動畫就是最好的例子。只不過電影經過膠片和放映機把它自動化了,而電子遊戲更進一步:不但能夠自動連續播放,並且過程當中你能夠去控制畫面中的內容。這有賴於計算機程序的實現,但本質是相通的。編程
咱們日常玩的遊戲,其實都是一張張圖像連續播放而成。播放的快慢,就是咱們常常聽到的「幀率」(FPS)。當你的電腦配置跟不上游戲的要求,運行幀數很低時,會被戲稱爲「幻燈片」,也正是因爲這個緣由。設計模式
基於此,遊戲程序的代碼在結構上就和通常的程序就有了明顯的區別,就是:網絡
對於遊戲來講,須要有一個不停執行的循環,不停產生圖像,並把它顯示到屏幕上。在咱們 pygame 的教程中,你能夠很明顯地看到這個:數據結構
while True:
...
複製代碼
在主循環裏進行的各類讀寫、計算、處理、渲染……構成了遊戲的每一幀。有一類遊戲開發崗位常見的面試題,我面試 Ubisoft 的時候被問到過,後來也用來問過不少應聘者:架構
以一個 FPS 遊戲爲例,列舉遊戲在一幀內須要處理哪些事情?
給出一份個人參考答案:編輯器
這一些列動做須要用到大量 CPU 和 GPU(顯卡)的計算。計算的快慢決定了遊戲一幀的耗時。一般最耗時的操做在於實時的動畫計算和光照渲染。這就是爲何當你玩遊戲卡頓時,能夠經過調低畫面效果、關閉軟陰影/抗鋸齒、下降模型質量等方法改善,或者,買一塊更強大的顯卡……
遊戲程序的主體結構抽象來講就是這樣一個流程:
這裏提一個小細節,就是若是咱們計算運動是按照每一幀更新固定的長度來計算,就會出現運算速度快的電腦上幀數很高,運動就很快,反之差的電腦上就很慢(咱們 pygame 教程裏的打飛機遊戲就是如此)。一般的解決方法,一種是固定幀數,你們都是30幀運行;還有一種就是對運動速度進行修正,最簡單的辦法就是以固定值乘以上一幀實際消耗的時間。
談了遊戲程序的總體結構,我再來講幾個遊戲開發中經常使用設計理念和模式。
首先是面向對象。由於遊戲大可能是對現實場景的模擬和抽象,含有衆多角色和道具,因此它比其餘程序更適合使用面向對象的設計。很多企業在面試時也會用遊戲角色的設計來考察面向對象的概念。好比:一個兵種就是一個類,它有父類(角色),有子類(細分兵種),有屬性(血量、攻擊),有方法(攻擊、死亡)。
MVC模式(Model-View-Controller),即把模型、視圖、控制器分離開的設計。在遊戲開發中,經過 MVC 模式,將遊戲玩家、場景及角色的數據(Model)、遊戲畫面和菜單的顯示(View)、遊戲的輸入控制和邏輯處理(Controller)分離開,會讓程序的架構更合理,容易維護和擴展。
狀態機。遊戲中的角色,常常會有多種狀態的切換,好比第一人稱射擊遊戲中的站立、跑動、開鏡、下蹲、臥倒等。若是簡單的經過一堆 if-else 來管理各類狀態的切換,會讓代碼十分繁瑣很難以維護。這時候能夠了解下狀態機模式。
在實際的開發中,幾乎沒有團隊是從零開始寫一個遊戲,或多或少都會使用或自研遊戲引擎。所謂遊戲引擎,就是把咱們前面說到的一些遊戲中的通用工做,好比輸入處理、物理引擎、動畫、場景渲染、網絡交互等部分封裝起來,讓開發者能夠專一於遊戲自己玩法的開發。像以前提過的 Cocos、Unity,包括 pygame 都屬於遊戲引擎的範疇,只不過各自的形式和側重點有所不一樣。
在引擎之上,遊戲開發團隊還會爲遊戲製做專門的編輯器,以方便遊戲策劃人員編輯關卡和數值。若是你搗鼓過暴雪的魔獸爭霸、星際爭霸之類的編輯器,對此必定深有感觸。
一個最簡單的遊戲團隊,通常也有三類人:策劃、程序、美術。這是遊戲開發不可或缺的三個部分。策劃負責遊戲的玩法、數值、關卡、劇情等設計,程序負責實現功能以及開發相關工具,美術負責各類視覺素材。再多一點可能還會有專門的動畫和音效人員;也有我的獨立開發者全部工做一肩挑。而現在的大製做遊戲,團隊則要龐大許多,各類細化分工就遠不止這些了。
若是你有志於從事遊戲行業,或者想開發出屬於本身的遊戲,我給出一點建議:
以上是我關於遊戲開發的經驗與分享。你如有其餘想了解的,歡迎留言討論。
════
其餘文章及回答:
編程實訓 | 如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 人工智能 | 爬蟲 | 我用Python | requests | 計算機視覺
歡迎搜索及關注:Crossin的編程教室