ue4的build系统,继承并发展了3代的一如既往的复杂。。

一、每个configuration由两部份组成:【(性能)模式】+【(内容)组成】

模式有:Debug,DebugGame,Development,Shipping,Test

  Debug:引擎和游戏项目都是debug编译,最适合调试,不做任何优化,运行速度也是最慢的

  DebugGame:只有游戏项目用debug,引擎有适度优化,调试时某些变量看不到了

  Development:引擎和游戏项目都优化了,调试时某些变量看不到。运行速度适中,一般开发时都用这个,特别是编辑器也是用的这种模式。

  Shipping:发行版,极致优化,估计调试信息都没了。

  Test:包含额外的测试代码。

组成有:空(Game),Client,Server,Editor

  空:实际意义是【未指定】,也就是默认的意思(而不是什么都没有的空),包含客户端和服务器代码,不包含编辑器。

  Client:只包含客户端

  Server:只包含服务器

  Editor:包含所有三项。

注意:solution层级的“空”对应到project层级的名字是"Game",也就是默认为游戏(而非编辑器)的意思。

所以Debug_Game和DebugGame完全不是一回事,后者实际只是DebugGame_(空)的简化。

二、用launcher下载的预编译版Editor建立的工程,和用源码自编译版Editor建立的工程,结构会不一样。

预编译版Editor的工程只有少数几种configuration,且引擎工程仅用来阅读和调试,不能编译。

源码版工程分两种情况,1是引擎(如上图),包含了全部【模式+组成】的configuration组合,并且在构建时也会编译引擎

2是自己的工程,模式是全的,但组成只有Game和Editor两种,也就是不分纯客户端和纯服务器了

三、一些实现细节:

1、实际的编译是通过命令:

D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Client Win64 Debug -waitmutex

D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat usbp Win64 Debug "$(SolutionDir)$(ProjectName).uproject" -waitmutex

前者是编引擎,后者是编自己的工程,bat里再调用:

..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe %* -DEPLOY

参数意义如下:

REM %1 is the game name
REM %2 is the platform name
REM %3 is the configuration name

可以对比不同的组合:

Debug_Game:D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Game Win64 Debug -waitmutex

Debug_Editor:D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Editor Win64 Debug -waitmutex

DebugGame_Game:D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Game Win64 DebugGame -waitmutex

2、第1参数game name,表示的是一个UEBuildTarget,即构建目标,所谓目标也就是exe、dll这样的文件,毕竟构建来构建去,最终目的就是生成这些可执行文件。

UEBuildTarget总共有5类,分别由5个子类表示,正好是上面所说的组成里的4类,再加1个叫Program的类(各种命令行工具)

一个UEBuildTarget里包含两类信息,一是包含的模块UEBuildModule,二是构建规则,规则又分两类,即TargetRules和ModuleRules

其中TargetRules就是各相应工程目录下对应*.Target.cs文件描述,比如在Engine/Source目录下,就有4个文件分别对应各自的name,UE4Game/UE4Editor/UE4Client/UE4Server.Target.cs

而ModuleRules则是各*.Build.cs文件

简单来说,一个ModuleRules定义了一个具体的模块文件(exe/dll)怎么构建,比如要编译哪些源文件

而一个TargetRules定义了一个抽象的Target,由哪些模块组合而成,比如说一个Editor,实际对应着一个exe和一堆dll

3、这些不同的UEBuildTarget类型,最直观的差别就是它们分别定义了各自的预处理器宏

如UEBuildEditor里:

OutCPPEnvironmentConfiguration.Definitions.Add("UE_EDITOR=1");

就添加了UE_EDITOR定义,这就会导致代码里大段大段被#if UE_EDITOR扩起来的地方被编译

而在代表纯游戏的UEBuildGame里,就不会编译那些代码,以减少体积和开销。

四、新建一个项目,实际生成两样东西:

1、game:是一个exe,而且以工程名命名,所有静态库全链接在一起,基本没有dll依赖,都看不出跟引擎有什么关联

2、editor:是一个dll,但是名字叫UE4Editor-xxxx.dll,实际上是做为UE4Editor.exe的一个插件,启动的时候运行的是引擎的exe

ue4 build configuration的解释的更多相关文章

  1. simplified build configuration

    http://blogs.msdn.com/b/saraford/archive/2005/08/16/452411.aspx Did you know… That you can hide the ...

  2. Xcode多种Build Configuration配置使用

    Build Configuration? Xcode默认会有2个编译模式,一个是Debug,一个是Release.Release下不能调试程序,编译时有做编译优化,会比用Debug打包出来的运行快,另 ...

  3. Xcode添加build configuration

    图片转载自:Adding a build configuration in Xcode

  4. Xcode的多种Build Configuration

    一: 建多个Configuration的目的. 多套域名打包. 1 开发时的域名. 2 内测时的域名. 3 公测时的域名. 4 企业版的域名. 5 APP Store的域名. 通过注释的方式,容易出错 ...

  5. Could not determine which “make” command to run. Check the “make” step in the build configuration

    环境: QT5.10 VisualStudio2015 错误1: Could not determine which “make” command to run. Check the “make” s ...

  6. [UE4]The global shader cache file missing 运行错误解决办法

    UE4项目在VS中对项目代码编译时报如错,找了好久在UE4论坛上查到了别人的解决方案,贴出来仅供大家参考. 看到一位开发者解释出错的原因如下: There are a number of build ...

  7. 《深入理解mybatis原理》 Mybatis初始化机制具体解释

    对于不论什么框架而言.在使用前都要进行一系列的初始化,MyBatis也不例外. 本章将通过下面几点具体介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XM ...

  8. UE4游戏开发基础命令

    在个人的Unrealengine账户中关联自己的GitHub账户成功之后,就可以访问UE4引擎的源码了. git clone -b release https://github.com/EpicGam ...

  9. Nutch的nutch-default.xml和regex-urlfilter.txt的中文解释

    nutch-default解释.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl&qu ...

随机推荐

  1. ant 自定义taskdef的工作目录

    上次同事在用ant执行多层目录的测试用例的时候遇到了一些问题,也就是自定义的taskdef的工作目录总是在开始执行ant的那个目录,而有一些地方用到了当前目录,因此很多测试用命的代码出现了“找不到自定 ...

  2. PHP取当前年、月、日开始时间戳和下年、月、日开始时间戳函数

    1.当前年的时间戳 2.当前月的时间戳 3.当前日的时间戳 4.明年的开始时间戳 5.下月的开始时间戳 6.明日的开始时间戳 7.当前时间戳 函数代码: /** * 获取时间戳 * $Ymd = Y ...

  3. DirectBuffer

    1.如何分配,分配是哪里的内存 ByteBuffer.allocateDirect()来分配(ByteBuffer.allocate()分配堆内内存),分配的是非Heap(堆外)的内存,不排除操作系统 ...

  4. Android Gradle 技巧之二: 最爱命令行

    命令行 很多做 Android 开发不久的同学,习惯于使用图形界面,对命令行操作很陌生甚至恐惧.遇到 AS 运行错误,束手无策.AS 为了确保易用性,也在 UI 界面上屏蔽了很多命令行运行的细节,导致 ...

  5. [ActionScript 3.0] NetConnection建立客户端与服务器的双向连接

    一个客户端与服务器之间的接口测试的工具 <?xml version="1.0" encoding="utf-8"?> <!--- - - - ...

  6. go 的 protoc 插件调用逻辑

    要让protoc使用插件,需要做下面事情: Place the plugin binary somewhere in the PATH and give it the name "proto ...

  7. Codeforces 724C [坐标][乱搞][模拟]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 从(0,0)出发与x轴正方向呈45度角的射线,在给定的矩形区域内不断发射,直到射入矩形的某个角停止. 给出多个坐标,问光线最早经过某坐标的时间. ...

  8. oracle 常见恢复

    author by :shawnloong 环境:windows 2008 r2 sp1 db:oracle 11g r2 做之前记得做个完整备份 ONFIGURE RETENTION POLICY ...

  9. sencha touch 入门系列 (二)sencha touch 开发准备

    这是本人第一次写博客教程,没什么经验,文笔也不是很好,写这教程一方面为了巩固自己这段时间的学习成果,一方面帮助大家解决问题,欢迎大家多提建议,指出问题.接下来我们就开始我们的sencha touch开 ...

  10. iOS开发--应用设置及用户默认设置【1、bundle的运用】

           在iphone里面,应用都会在“设置”里面有个专属的应用设置,选择该菜单界面,用户便可以在其中输入和更改各种选项,协助用户更便捷设置个人喜好与习惯. 在这一节中,希望能通过对捆绑包(bu ...