编者按
本文已于作者 @陈文礼 授权转载,原载于知乎,如需转载请务必联系原作者。
开发环境准备
就如我在(序)中所写,可能由于历史的原因,我更喜欢命令行。
况且,考虑到项目的庞大,和剩下的时日(可能也就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和内存对于编译效率也是至关重要的。如果内存过小,导致不得不使用页交换文件(就是将硬盘上的一个文件作为内存使用),那编译过程真是爽极了。
扯个无用的,听说 NautyDogs 有一台256?核心的超级服务器编译神海,大概可以做到半小时一个版本?(有点记不清了)
Windows 系统下可用的 Git 主要有:
另外 Visual Studio 里面也有一个版本可以安装的。
toolchain 方面,为了跨平台,最终会使用 clang。不过就如上面鸡汤的,我这里主要是想用一系列文章展示整个过程,包括换 toolchain 的过程。所以既然是Windows,我们先用 Visual Studio。
安装完Visual Studio(版本随便吧。我自己因为有订阅,各种版本都有。赶时髦就用最新的,2017)之后,在开始菜单里面应该可以找到一个叫 Developer Command Prompt 的东西,点击那个,就会启动一个命令行。这个命令行与普通命令行的区别是,它里面预先设置好了 Visual Studio 的工具的查找路径,好比下面这些:
C:UsersTim.AzureADSourceReposGameEngineFromScratch>path PATH=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 Studio2017Professional\MSBuild15.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;
然后打入 git 命令,将代码库下载到本地。
C:UsersTim.AzureADSourceRepos>git clone https://github.com/netwarm007/GameEngineFromScratch.git Cloning into 'GameEngineFromScratch'... remote: Counting objects: 8, done. remote: Compressing objects: 100% (8/8), done. remote: Total 8 (delta 2), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (8/8), done. Checking connectivity... done. C:UsersTim.AzureADSourceRepos>cd GameEngineFromScratch C:UsersTim.AzureADSourceReposGameEngineFromScratch>
好了,这里就是将来代码生长的地方了。
为了能方便的回到每篇文章所对应的代码状态,我在每篇文章开始的时候给代码打个 tag
C:UsersTim.AzureADSourceReposGameEngineFromScratch>git tag -a v0.0 -m "Initial" C:UsersTim.AzureADSourceReposGameEngineFromScratch>git tag v0.0
这样我们就可以通过下面的命令随时回到这个状态,
C:UsersTim.AzureADSourceReposGameEngineFromScratch>git checkout -b article_1 v0.0 Switched to a new branch 'article_1' C:UsersTim.AzureADSourceReposGameEngineFromScratch>git branch * article_1 master
新建的 article_1 这个 branch 就处于我们这篇文章开头的状态了。
现在让我们来写第一个文件,HelloEngine.cpp。你可以通过输入
C:UsersTim.AzureADSourceReposGameEngineFromScratch>notepad
来启动记事本,开始写你的代码。或者用任何一款编辑器。我个人是喜欢 Vim。能在 Windows 下用的 Vim 可以从这里安装:
不过这个编辑器是很古老很另类的,缺省不支持鼠标,分为命令模式和编辑模式,全部操作均是键盘完成。如果想要学习,同样,网上有很多资料,请搜索。
另外有个选项是 gVim,这个支持鼠标。
好了,在编辑器里敲入如下内容:
#includevoid main() { printf("Hello Engine!n"); }
然后保存为 main.c (如果是用的 vim,按 ESC 退出编辑模式,输入:w main.c ),退出编辑器(vim的话,输入:q)
回到命令行,输入:
C:UsersTim.AzureADSourceReposGameEngineFromScratch>cl main.c 用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.10.25019 版 版权所有(C) Microsoft Corporation。保留所有权利。 main.c Microsoft (R) Incremental Linker Version 14.10.25019.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:main.exe main.obj
这样就好了。打入dir命令看看生成了啥文件:
C:UsersTim.AzureADSourceReposGameEngineFromScratch>dir 驱动器 C 中的卷是 OS 卷的序列号是 38A2-CBDD C:UsersTim.AzureADSourceReposGameEngineFromScratch 的目录 2017/08/18 09:31. 2017/08/18 09:31 .. 2017/08/18 08:30 302 .gitignore 2017/08/18 08:30 1,088 LICENSE 2017/08/18 09:29 71 main.c 2017/08/18 09:31 97,280 main.exe 2017/08/18 09:31 1,285 main.obj 2017/08/18 08:30 103 README.md 6 个文件 100,129 字节 2 个目录 930,610,339,840 可用字节
执行main.exe
C:UsersTim.AzureADSourceReposGameEngineFromScratch>main.exe Hello Engine!
好了,基本环境准备完毕。
实施 Save 大法,保存我们的成果:
C:UsersTim.AzureADSourceReposGameEngineFromScratch>git add main.c C:UsersTim.AzureADSourceReposGameEngineFromScratch>git commit -m "article 1 end" [article_1 2be2939] article 1 end Committer: TimYour name and email address were configured automatically based on your username and hostname. Please check that they are accurate. You can suppress this message by setting them explicitly: git config --global user.name "Your Name" git config --global user.email you@example.com After doing this, you may fix the identity used for this commit with: git commit --amend --reset-author 1 file changed, 6 insertions(+) create mode 100644 main.c C:UsersTim.AzureADSourceReposGameEngineFromScratch>git config --global user.name "Chen Wenli" C:UsersTim.AzureADSourceReposGameEngineFromScratch>git config --global user.emal "chenwenli(at)chenwenli.com" C:UsersTim.AzureADSourceReposGameEngineFromScratch>git commit -m "article 1 end" On branch article_1 nothing to commit, working directory clean
自己开发次世代引擎,有钱人的兴趣爱好
LZ 要做中文版的 Handmade Hero 么,支持一下。
其实LZ都不知道自己在做什么,哈哈
这个代码太乱了
我表示你这个比开发游戏还难