就放荡不羁就h 发表于 2020-12-25 18:43

游戏引擎之12k问题

前言

一个游戏引擎的build system应该是什么?如果你能回答这个问题,说明你能找到一个12k的程序员开发工作。
本文将探讨三个引擎的不同Build的组成和设计理念。
这三个引擎分别为:
UnrealEngine(引擎开源):,自研BuildSystemUnity(引擎闭源):基于开源项目改造的自研BuildSystem(开源)CryEngine(引擎开源):基于CMake
CMake

首先讨论CMake,对于CMake有个灵魂问题是:
CMake 也配叫做 Build system?那么问题是:什么是Build System?
让我们先搁置CMake的讨论,先探索一下微软那学了就找不到工作的技术栈所用的BuildSystem:MSBuild
MSBuild

msbuild就是一个
Build System,尽管他把自己叫做Build Engine。
如果你使用过Visual Studio开发过cpp/C#项目。当你对项目发起编译时,实际上是给操作系统发起了
                   msbuild 项目文件名的进程请求。Visual Studio将重定向程序的输出到Visual Stuido的输出中。
对于一个Cpp项目来说,一次Build过程只有编译和链接两个步骤。MSBuild执行这两个步骤的方式是发起
cl 源文件 编译参数然后又是重定向...
对于执行什么步骤需要使用什么应用程序,这部分一般使用C#来编写。
对于执行这些程序的输入与输出描述,这部分一般描述为XML文件。
但是事实上,对于某个特定的语言,一般都有着大家都认同的构建过程。这其中还涉及到一些包管理的问题。
对于CPP,目前大家都认同的工具是CMake。但是一个Build System往往不仅仅是产生二进制文件就完成了自身职责。
比如前端开发界那声名远扬的webpack......(webpack 又不是 build system)
CMake

cmake不是build system,他是build system generator。至于cmake为什么做出这样,我无从得知。
对于一些CPP项目,我们往往要为其编译多个平台的二进制,这其中包括:
Windows : cmake . -G "Visual Sutido 15 2017"=> msbuildAndroid : cmake . -G "??? "=>ndk/makeMac:cmake . -G "???"=> ???
对于cmake的使用,你需要在不同的平台选用不同的Generators生成一些文件,然后再使用对应的平台工具输入这些文件。
跨平台如何编译是一个困扰cpp程序员的问题,不同平台的编译器具备不同的编译参数,编译Bug,以及语言特性。(谁叫cpp有这么多编译器了)
而cmake他帮你处理不同平台的build system 的差异,以及帮你处理一些不同编译参数的差异。比如
如何设置编译器的cpp标准。对于使用CMake的程序员来说,有时候除了要熟知目标系统有哪些Build System,有哪些编译器和编译参数之外,还需要学会如何编写CMake的输入文件:
cmakelists.txt可能他不想如同msbuild一样使用xml,于是他自行发明了DSL。所以
中就会有:使用cmake堆排序。
先不说DSL本身发明的怎么样,但引入一个新语言,会引入一系列伴随问题:
         如何调试/语法高亮/代码提示当然可以学习js界的做法。选择一个别的语言转发到cmake来避免上述问题:
cmake其DSL就和msbuild的XML一样啰嗦。
无论如何你总得写target 名字,递归某个目录得到cpp文件以及相关得头文件依赖。
但无论如何,cmake可以工作,不然cryengine也不会选用,你只是需要再写一些bat/sh来完成这样一个目标:
         一次命令 完成Windows二进制和Android二进制得构建。
所以我们要选择一个Build System,其输入必须是某种流行语言。
对于Unreal和Unity都选择了同一个语言:C#
Bee

这是Aras-p在Unity BuildTeam两年得工作成果。尽管我第一次使用我就很不爽。
TODO:由于某些原因,需要详细阅读源码来输出文章,而不能用工作中已知得结果来编写。
UnrealBuildTool

由于Unreal是个非常庞大得代码和资源仓库。其编译和发布是两个不同的程序,后者的输入也是XML...本文只介绍前者。
UnrealBuildTool有着上述两者都没有的功能:RemoteMacBuild。
苹果编译有着让人烦人的签名和证书,以及公司都不会给开发者太好的mac机器。当一个游戏发布mac包,就需要在mac系统上进行缓慢的蛋疼操作。
而Unreal,只需要配置好RemoteMac,就可以在Window上面打出IPA。这对于日常的IOS开发测试无疑是天降福音!!!
实现泥潭

尽管这些工具提供的功能是大同小异,但是其健壮性真是千差万别。Unity的无疑是最烂的,让我们从一个简单的例子讲起,寻找MSVC和Windows SDK
先说结论:Unity2019.1 要求使用VS2017来编译,但是:
不能处理同时安装vs2017和vs2019的情况不能处理vs2019安装vs2017 toolset的情况
有时候,不知道这种问题到底是不是应该怪罪微软对于Visual Studio的组织没有统一的形势。但是明显UE4 UnrealBuildTool正确的处理了上述两种情况,其要求的toolset版本会写在cs源码文件中来寻找最佳匹配。
用于匹配的列表
微软是从VS2017开始支持多套编译工具链以及多个windows sdk,但是要如何正确的找到他们:
VSWhere注册表硬编码路径
页: [1]
查看完整版本: 游戏引擎之12k问题