前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【转】从零开始手敲次世代游戏引擎(一)

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

作者头像
代码咖啡
发布2018-09-29 15:07:29
9910
发布2018-09-29 15:07:29
举报
文章被收录于专栏:程序员叨叨叨

本文转自知乎,由超级码农陈文礼大神编写,已获原作者授权,原文链接: 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的工具的查找路径,好比下面这些:

代码语言:javascript
复制
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命令,将代码库下载到本地。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

这样我们就可以通过下面的命令随时回到这个状态

代码语言:javascript
复制
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。你可以通过输入

代码语言:javascript
复制
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>notepad

来启动记事本,开始写你的代码。或者用任何一款编辑器。我个人是喜欢Vim。能在Windows下用的Vim可以从这里安装: download : vim online

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

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

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

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

代码语言:javascript
复制
#include <stdio.h>

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

然后保存为main.c (如果是用的vim,按ESC退出编辑模式,输入:w main.c ),退出编辑器(vim的话,输入:q)

回到命令行,输入:

代码语言:javascript
复制
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命令看看生成了啥文件:

代码语言:javascript
复制
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

代码语言:javascript
复制
C:\Users\Tim.AzureAD\Source\Repos\GameEngineFromScratch>main.exe
Hello Engine!

好了,基本环境准备完毕。

实施Save大法,保存我们的成果:

代码语言:javascript
复制
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 国际许可协议进行许可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.09.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开发环境准备
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档