美文网首页
【转】从零开始手敲次世代游戏引擎(一)

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

作者: 代码咖啡 | 来源:发表于2018-09-28 12:21 被阅读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的工具的查找路径,好比下面这些:

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

    相关文章

      网友评论

          本文标题:【转】从零开始手敲次世代游戏引擎(一)

          本文链接:https://www.haomeiwen.com/subject/vkuanftx.html