本文转自知乎,由超级码农陈文礼大神编写,已获原作者授权,原文链接: https://zhuanlan.zhihu.com/p/28589792
就如我在(序)中所写,可能由于历史的原因,我更喜欢命令行。
况且,考虑到项目的庞大,和剩下的时日(可能也就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主要有
另外Visual Studio里面也有一个版本可以安装的。
toolchain方面,为了跨平台,最终会使用clang。不过就如上面鸡汤的,我这里主要是想用一系列文章展示整个过程,包括换toolchain的过程。所以既然是Windows,我们先用Visual Studio。
安装完Visual Studio(版本随便吧。我自己因为有订阅,各种版本都有。赶时髦就用最新的,2017)之后,在开始菜单里面应该可以找到一个叫Developer Command Prompt的东西,点击那个,就会启动一个命令行。这个命令行与普通命令行的区别是,它里面预先设置好了Visual Studio的工具的查找路径,好比下面这些:
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>path
PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCPackages;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TestWindow;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\bin\Roslyn;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Team Tools\Performance Tools;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\;C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\;C:\Program Files (x86)\Windows Kits\10\bin\x86;C:\Program Files (x86)\Windows Kits\10\bin\10.0.14393.0\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\\MSBuild\15.0\bin;C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\;C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\;C:\Program Files (x86)\SCE\ORBIS SDKs\4.500\host_tools\bin;C:\Program Files (x86)\SCE\ORBIS\Tools\Target Manager Server\bin;C:\Program Files (x86)\SCE\ORBIS\Tools\Publishing Tools\bin;C:\Program Files (x86)\SCE\PSP2\Tools\Publishing Tools\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\libnvvp;C:\Program Files (x86)\SCE\Common\SceVSI-VS14\bin;C:\Program Files (x86)\SCE\Common\SceVSI-VS12\bin;C:\Program Files (x86)\SCE\Common\SN-DBS\bin;C:\VulkanSDK\1.0.37.0\Bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\libnvvp;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\SCE\PSP2\Tools\Target Manager Server\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Perforce;C:\Program Files\Perforce\DVCS\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Git\cmd;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\NVIDIA Corporation\Cg\bin;C:\Program Files (x86)\NVIDIA Corporation\Cg\bin.x64;C:\Program Files (x86)\PuTTY\;C:\Program Files\MATLAB\R2016b\bin;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Users\Tim.AzureAD\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\Tim.AzureAD\AppData\Local\Programs\Python\Python36\;C:\Program Files (x86)\CMake\bin;C:\Users\Tim.AzureAD\AppData\Local\Microsoft\WindowsApps;C:\Program Files\GPAC;
然后打入git命令,将代码库下载到本地。
C:\Users\Tim.AzureAD\Source\Repos>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:\Users\Tim.AzureAD\Source\Repos>cd GameEngineFromScratch
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>
好了,这里就是将来代码生长的地方了。
为了能方便的回到每篇文章所对应的代码状态,我在每篇文章开始的时候给代码打个tag
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git tag -a v0.0 -m "Initial"
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git tag
v0.0
这样我们就可以通过下面的命令随时回到这个状态
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git checkout -b article_1 v0.0
Switched to a new branch 'article_1'
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git branch
* article_1
master
新建的article_1这个branch就处于我们这篇文章开头的状态了。
现在让我们来写第一个文件,HelloEngine.cpp。你可以通过输入
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>notepad
来启动记事本,开始写你的代码。或者用任何一款编辑器。我个人是喜欢Vim。能在Windows下用的Vim可以从这里安装: download : vim online
不过这个编辑器是很古老很另类的,缺省不支持鼠标,分为命令模式和编辑模式,全部操作均是键盘完成。如果想要学习,同样,网上有很多资料,请搜索。
另外有个选项是gVim,这个支持鼠标。
好了,在编辑器里敲入如下内容:
#include <stdio.h>
void main() {
printf("Hello Engine!\n");
}
然后保存为main.c (如果是用的vim,按ESC退出编辑模式,输入:w main.c ),退出编辑器(vim的话,输入:q)
回到命令行,输入:
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>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:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>dir
驱动器 C 中的卷是 OS
卷的序列号是 38A2-CBDD
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch 的目录
2017/08/18 09:31 <DIR> .
2017/08/18 09:31 <DIR> ..
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:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>main.exe
Hello Engine!
好了,基本环境准备完毕。
实施Save大法,保存我们的成果:
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git add main.c
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git commit -m "article 1 end"
[article_1 2be2939] article 1 end
Committer: Tim <wenli.chen@scesh.cn>
Your 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:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git config --global user.name "Chen Wenli"
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git config --global user.emal "chenwenli(at)chenwenli.com"
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>git commit -m "article 1 end"
On branch article_1
nothing to commit, working directory clean
(-- END --)
本作品采用知识共享署名 4.0 国际许可协议进行许可。