【转】从零开始手敲次世代游戏引擎(一)

本文转自知乎,由超级码农陈文礼大神编写,已获原作者授权,原文链接: 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主要有

Git for Windows

另外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,这个支持鼠标。

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

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

#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 国际许可协议进行许可。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

ASP.NET Core 性能对比评测(ASP.NET,Python,Java,NodeJS)

前言 性能是我们日常生活中经常接触到的一个词语,更好的性能意味着能给我们带来更好的用户体检。比如我们在购买手机、显卡、CPU等的时候,可能会更加的关注于这样指标...

1.8K60
来自专栏张善友的专栏

ASP.NET MVC Framework 动态汇集

Scott Guthrie在ALT.NET会议中展示了ASP.NET MVC Framework,它的CTP版本将于今年年底放出。 这个框架将支持以下特性: ...

19950
来自专栏张善友的专栏

ASP.NET开发人员需要学习ASP.NET MVC么?

InfoQ上有篇文章ASP.NET开发人员需要学习ASP.NET MVC么? 文章已经覆盖了绝大多数对于学习/使用ASP.NET MVC的观点。 我觉得ASP....

21390
来自专栏Windows Community

New UWP Community Toolkit

概述 UWP Community Toolkit 是一个 UWP App 自定义控件、应用服务和帮助方法的集合,能够很大程度的简化和指引开发者的开发工作,相信广...

378110
来自专栏张善友的专栏

.Net 跨平台可移植类库PCL可用于任何平台包括Mono

Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能。 利用 PCL,您可以有选择性地面向 .NET Fr...

223100
来自专栏.NET开发者社区

​(码友推荐)2018-07-23 .NET及相关开发资讯速递

9.Advisory on July 2018 .NET Framework Updates

15350
来自专栏张善友的专栏

国内 Mono 相关文章汇总

一则新闻《软件服务提供商Xamarin融资1200万美元》,更详细的内容可以看Xamarin的官方博客Xamarin raises $12M to help y...

33460
来自专栏NetCore

【翻译】Asp.net Core介绍

ASP.NET Core is a significant redesign of ASP.NET. This topic introduces the new...

20690
来自专栏张善友的专栏

One ASP.NET

大多数情况下,我是一名 ASP.NET开发人员。我不需要指定 MVC 或 Web Form,他们都是微软One ASP.NET战略的核心。我的应用程序往往是混合...

275100
来自专栏张善友的专栏

开源Mono框架将C#编程带到iPhone、Android和Wii

Mono,作为.NET运行库的开源实现,正在将微软的技术带到未曾预料到的地方,包括iPhone,Android和Wii。 根据Novell公司的首席Mono...

30870

扫码关注云+社区

领取腾讯云代金券