標籤:

從零開始手敲次世代遊戲引擎(一)

開發環境準備

就如我在(序)中所寫,可能由於歷史的原因,我更喜歡命令行。

況且,考慮到項目的龐大,和剩下的時日(可能也就1~2萬天了),基於已經過去的1萬多天的經驗,這過程當中比爾蓋茨一定會死去,馮氏架構也可能成為遺物。所以,保持代碼的獨立性尤為重要。用流行的話來說,要奉行極簡主義。

另外還是想再啰嗦幾句,我寫這個的目的更多是為了展現其過程。世面上好的商用引擎已經大多開源,投入的資源和精力絕非我在剩下的區區萬日當中能夠付出的。我只是想學學去西藏布達拉宮的那些朝拜者者一樣,三步九叩,享受這個前進的過程,也是對自己的一個梳理。很可能會掛在半路,但那又如何呢?

總之,我覺得人生來就是一個容器,前1萬天是大家給你灌水,後1萬天是你給大家灌水。目的是傳承,這就是我理解的人生意義。

---------- 雞湯分割線 ------------

其實我個人是比較喜歡Linux系統的,因為那個更純粹。不過考慮到現實讀者可能大多數是Windows用戶,自己也是從MS系起步的,那麼就從Windows開始吧。

首先是給代碼找個家,這個很重要。接下來的路很長,充滿著未知的危險,我們需要Save-Load大法。

全世界程序員目前比較常用的代碼託管工具之一GitHub,我也常用,就在這裡安家吧。

netwarm007/GameEngineFromScratch

Git這個工具思想比較奇特,對於沒有用過代碼管理,或者只用過SVN的人來說,可能不太容易上手。不過GitHub本身是網頁版的,下個ZIP包展開還是比較容易的。

Git工具的教程網上很多,需要的自己搜一下。關鍵字「git 教程」或者「git tutorial」。

關於科技類的搜索,我是推薦谷歌。如果上不去,Bing也是不錯的。記得切換到國際版。

關於本地目錄,這個隨便了,選你自己喜歡的地方就好。要說經驗,一般來說源代碼文件都是小文件,幾k幾十k一個,編譯的時候特別是鏈接的時候,toolchain(就是編譯鏈接工具)會同時打開很多個文件。所以對於大的代碼樹的編譯,磁碟IO性能是挺重要的。另外,編譯器本身就是計算機科學當中十分深奧晦澀的東西,涉及大量數據結構和演算法。在編譯的過程當中,會在內存當中生成很多各種各樣的數據結構,用來確定寄存器的分配,對代碼進行分析和優化。因此,毋庸置疑CPU和內存對於編譯效率也是至關重要的。如果內存過小,導致不得不使用頁交換文件(就是將硬碟上的一個文件作為內存使用),那編譯過程真是爽極了。

扯個無用的,聽說NaughtyDog有一台256?核心的超級伺服器編譯神海,大概可以做到半小時一個版本?(有點記不清了)

Windows系統下可用的Git主要有

Git for Windows

另外Visual Studio裡面也有一個版本可以安裝的。

toolchain方面,為了跨平台,最終會使用clang。不過就如上面雞湯的,我這裡主要是想用一系列文章展示整個過程,包括換toolchain的過程。所以既然是Windows,我們先用Visual Studio。

安裝完Visual Studio(版本隨便吧。我自己因為有訂閱,各種版本都有。趕時髦就用最新的,2017)之後,在開始菜單裡面應該可以找到一個叫Developer Command Prompt的東西,點擊那個,就會啟動一個命令行。這個命令行與普通命令行的區別是,它裡面預先設置好了Visual Studio的工具的查找路徑,好比下面這些:

C:UsersTim.AzureADSourceReposGameEngineFromScratch>pathnPATH=C:Program Files (x86)Microsoft Visual Studio2017ProfessionalVCToolsMSVC14.10.25017binHostX86x86;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7IDEVCVCPackages;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7IDECommonExtensionsMicrosoftTestWindow;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7IDECommonExtensionsMicrosoftTeamFoundationTeam Explorer;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalMSBuild15.0binRoslyn;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalTeam ToolsPerformance Tools;C:Program Files (x86)Microsoft Visual StudioSharedCommonVSPerfCollectionTools;C:Program Files (x86)Microsoft SDKsWindowsv10.0AbinNETFX 4.6.1 Tools;C:Program Files (x86)Windows Kits10binx86;C:Program Files (x86)Windows Kits10bin10.0.14393.0x86;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalMSBuild15.0bin;C:WINDOWSMicrosoft.NETFrameworkv4.0.30319;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7IDE;C:Program Files (x86)Microsoft Visual Studio2017ProfessionalCommon7Tools;C:Program Files (x86)SCEORBIS SDKs4.500host_toolsbin;C:Program Files (x86)SCEORBISToolsTarget Manager Serverbin;C:Program Files (x86)SCEORBISToolsPublishing Toolsbin;C:Program Files (x86)SCEPSP2ToolsPublishing Toolsbin;C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0bin;C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0libnvvp;C:Program Files (x86)SCECommonSceVSI-VS14bin;C:Program Files (x86)SCECommonSceVSI-VS12bin;C:Program Files (x86)SCECommonSN-DBSbin;C:VulkanSDK1.0.37.0Bin;C:Program FilesNVIDIA GPU Computing ToolkitCUDAv7.5bin;C:Program FilesNVIDIA GPU Computing ToolkitCUDAv7.5libnvvp;C:ProgramDataOracleJavajavapath;C:Program Files (x86)SCEPSP2ToolsTarget Manager Serverbin;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:Program FilesIntelWiFibin;C:Program FilesCommon FilesIntelWirelessCommon;C:Program FilesPerforce;C:Program FilesPerforceDVCS;C:Program FilesMicrosoft SQL Server110ToolsBinn;C:Program Files (x86)GtkSharp2.12bin;C:Program FilesMicrosoft SQL Server130ToolsBinn;C:Program FilesGitcmd;C:Program Files (x86)NVIDIA CorporationPhysXCommon;C:Program Files (x86)NVIDIA CorporationCgbin;C:Program Files (x86)NVIDIA CorporationCgbin.x64;C:Program Files (x86)PuTTY;C:Program FilesMATLABR2016bbin;C:Program FilesTortoiseSVNbin;C:Program Files (x86)Windows Kits10Windows Performance Toolkit;C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:UsersTim.AzureADAppDataLocalProgramsPythonPython36Scripts;C:UsersTim.AzureADAppDataLocalProgramsPythonPython36;C:Program Files (x86)CMakebin;C:UsersTim.AzureADAppDataLocalMicrosoftWindowsApps;C:Program FilesGPAC;n

然後打入git命令,將代碼庫下載到本地。

C:UsersTim.AzureADSourceRepos>git clone https://github.com/netwarm007/GameEngineFromScratch.gitnCloning into GameEngineFromScratch...nremote: Counting objects: 8, done.nremote: Compressing objects: 100% (8/8), done.nremote: Total 8 (delta 2), reused 0 (delta 0), pack-reused 0nUnpacking objects: 100% (8/8), done.nChecking connectivity... done.nnC:UsersTim.AzureADSourceRepos>cd GameEngineFromScratchnnC:UsersTim.AzureADSourceReposGameEngineFromScratch>n

好了,這裡就是將來代碼生長的地方了。

為了能方便的回到每篇文章所對應的代碼狀態,我在每篇文章開始的時候給代碼打個tag

C:UsersTim.AzureADSourceReposGameEngineFromScratch>git tag -a v0.0 -m "Initial"nnC:UsersTim.AzureADSourceReposGameEngineFromScratch>git tagnv0.0n

這樣我們就可以通過下面的命令隨時回到這個狀態

C:UsersTim.AzureADSourceReposGameEngineFromScratch>git checkout -b article_1 v0.0nSwitched to a new branch article_1nnC:UsersTim.AzureADSourceReposGameEngineFromScratch>git branchn* article_1n mastern

新建的article_1這個branch就處於我們這篇文章開頭的狀態了。

現在讓我們來寫第一個文件,HelloEngine.cpp。你可以通過輸入

C:UsersTim.AzureADSourceReposGameEngineFromScratch>notepadn

來啟動記事本,開始寫你的代碼。或者用任何一款編輯器。我個人是喜歡Vim。能在Windows下用的Vim可以從這裡安裝:

download : vim online

不過這個編輯器是很古老很另類的,預設不支持滑鼠,分為命令模式和編輯模式,全部操作均是鍵盤完成。如果想要學習,同樣,網上有很多資料,請搜索。

另外有個選項是gVim,這個支持滑鼠。

gvim.en.softonic.com/

好了,在編輯器里敲入如下內容:

#include <stdio.h>nnvoid main() {ntprintf("Hello Engine!n");n}n

然後保存為main.c (如果是用的vim,按ESC退出編輯模式,輸入:w main.c ),退出編輯器(vim的話,輸入:q)

回到命令行,輸入:

C:UsersTim.AzureADSourceReposGameEngineFromScratch>cl main.cn用於 x86 的 Microsoft (R) C/C++ 優化編譯器 19.10.25019 版n版權所有(C) Microsoft Corporation。保留所有權利。nnmain.cnMicrosoft (R) Incremental Linker Version 14.10.25019.0nCopyright (C) Microsoft Corporation. All rights reserved.nn/out:main.exenmain.objn

這樣就好了。打入dir命令看看生成了啥文件:

C:UsersTim.AzureADSourceReposGameEngineFromScratch>dirn 驅動器 C 中的卷是 OSn 卷的序列號是 38A2-CBDDnn C:UsersTim.AzureADSourceReposGameEngineFromScratch 的目錄nn2017/08/18 09:31 <DIR> .n2017/08/18 09:31 <DIR> ..n2017/08/18 08:30 302 .gitignoren2017/08/18 08:30 1,088 LICENSEn2017/08/18 09:29 71 main.cn2017/08/18 09:31 97,280 main.exen2017/08/18 09:31 1,285 main.objn2017/08/18 08:30 103 README.mdn 6 個文件 100,129 位元組n 2 個目錄 930,610,339,840 可用位元組n

執行main.exe

C:UsersTim.AzureADSourceReposGameEngineFromScratch>main.exenHello Engine!n

好了,基本環境準備完畢。

實施Save大法,保存我們的成果:

C:UsersTim.AzureADSourceReposGameEngineFromScratch>git add main.cnnC:UsersTim.AzureADSourceReposGameEngineFromScratch>git commit -m "article 1 end"n[article_1 2be2939] article 1 endn Committer: Tim <wenli.chen@scesh.cn>nYour name and email address were configured automatically basednon your username and hostname. Please check that they are accurate.nYou can suppress this message by setting them explicitly:nn git config --global user.name "Your Name"n git config --global user.email you@example.comnnAfter doing this, you may fix the identity used for this commit with:nn git commit --amend --reset-authornn 1 file changed, 6 insertions(+)n create mode 100644 main.cnnC:UsersTim.AzureADSourceReposGameEngineFromScratch>git config --global user.name "Chen Wenli"nnC:UsersTim.AzureADSourceReposGameEngineFromScratch>git config --global user.emal "chenwenli(at)chenwenli.com"nnC:UsersTim.AzureADSourceReposGameEngineFromScratch>git commit -m "article 1 end"nOn branch article_1nnothing to commit, working directory cleann

(-- END --)

本作品採用知識共享署名 4.0 國際許可協議進行許可。

推薦閱讀:

「千萬別學我!」之遊戲開發者的囧事(上)
遊戲開發匯總 (Gu Lu's Blog)
An Unnormal Normal Approach to 3D Modeling
webgame為什麼總是倚重冷卻時間這個要素?
Monster Farm 開發日誌 (二)邊緣檢測

TAG:游戏开发 |