从零开始手敲次世代游戏引擎#1

作者:转载小公举
2017-09-06
13 6 5

编者按

本文已于作者 @陈文礼 授权转载,原载于知乎,如需转载请务必联系原作者。

开发环境准备

就如我在()中所写,可能由于历史的原因,我更喜欢命令行。

况且,考虑到项目的庞大,和剩下的时日(可能也就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 主要有:

Git for Windows

另外 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 可以从这里安装:

download : vim online

不过这个编辑器是很古老很另类的,缺省不支持鼠标,分为命令模式和编辑模式,全部操作均是键盘完成。如果想要学习,同样,网上有很多资料,请搜索。

另外有个选项是 gVim,这个支持鼠标。

https://gvim.en.softonic.com/

好了,在编辑器里敲入如下内容:

#include 

void main() {
	printf("Hello Engine!n");
}

A
然后保存为 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: Tim 
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: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

近期点赞的会员

 分享这篇文章

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. LouisLiu 2017-09-06

    自己开发次世代引擎,有钱人的兴趣爱好

  2. mutoo 2017-09-13

    LZ 要做中文版的 Handmade Hero 么,支持一下。

  3. kris 2018-06-06

    其实LZ都不知道自己在做什么,哈哈

  4. iZhuqling 2018-11-02 微信会员

    这个代码太乱了

  5. mort 2019-09-03

    我表示你这个比开发游戏还难

您需要登录或者注册后才能发表评论

登录/注册