找回密码
 立即注册
查看: 390|回复: 2

《UE4开发笔记》Tip 1 编译完全指南

[复制链接]
发表于 2022-5-11 08:51 | 显示全部楼层 |阅读模式

在UE4的蓝图项目里,所有的编译任务都在编辑器(Editor)中来完成,对蓝图的编辑只需要点击编辑器内置的编译(Compile)按钮就可以,一切看起来那么和谐。


但在UE4的C++项目里,编译这件事就开始变得魔幻起来了,IDE(VS/Rider)里面有提供编译,编辑器里面又有提供编译,这些编译涉及到的东西可能就不是点一个按钮那么简单了。
本次编写的编译指南主要包含以下3个和编译相关的常见问题:

  • IDE中不同的编译选项有什么不同?是用Development Editor?还是DebugGame?…;
  • Hot Reload和Live Coding;
  • 在修改源码的引擎的项目里,编译总是会把引擎源码也一起编译了(时间老长了)?如何避免这样的问题?
1 不同的编译选项?



在IDE里面,能看到UE4默认的Development Editer Win64编译选项,点开下拉栏我们能看到更多的选项(不得不吐槽一句Rider的选项组织方式),大部分人在开发的时候基本上也就是使用默认的选项了,不过作为一名合格的工程师,刨根问底是我们的天性,所以其他选项和默认选项到底有什么不同呢?


这事吧,其实UE4官方文档也有写,但UE4官方维护的文档一直有个毛病就是:读的都是字,连起来就看不懂了。四处翻找了一些资料过后,找了一些民间比较通俗的解释来“补充”一下文档里各个编译选项的意思。



首先编译选项的名字分为三部分:

  • 第一部分是状态(State),表示当前引擎和项目的开发状态,分为Debug、DebugGame、Development、Shipping以及Test;
  • 第二部分是目标(Target),表示当前编译运行的程序的目标(比如要做什么),分为Empty(也就是空)、Editor、Client以及Server;
  • 第三部分也比较好理解,就是平台(Platform),指编译运行的目标平台。
状态(State)

  • Debug:同时在引擎和游戏项目的编译中包含用于调试的符号(debug symbols),适合用于在IDE中调试C++的代码(引擎或者游戏项目),可以完整的看到调试过程中的代码流程和变量数据内容;
  • DebugGame:对引擎代码进行优化编译,只在游戏项目的编译中包含用于调试的符号,适合用于只调试游戏代码;
  • Development:默认选项,不对代码进行优化编译,虽然也可以Debug,但是调试过程中可能会出现部分代码跳过(被优化),部分变量的数据内容显示不完整等问题;
  • Shipping:最佳性能的编译配置,用于游戏发布的编译,不包含任何开发相关的编译内容引入。
  • Test:相比Shipping来说,只是启用了一些控制台命令、统计数据和性能分析工具,适合用于最终产品测试场景。
目标(Target)

  • Empty:空就是指那些没有第二部分的编译选项,比如DebugGame Win64,只编译构建游戏项目的独立可执行版本,但需要提前对当前平台进行内容的烘焙(Cook,在编辑器中执行);只包含客户端(Client)和服务器(Server)的代码,不包含编辑器(Editor)(所以就不会启动编辑器了);
  • Editor:包含所有代码(Editor/Client/Server),代表是在项目开发阶段,你会使用编辑器来编辑运行项目,编译运行后会启动编辑器打开项目;
  • Client:只包含客户端的代码,在一些UE4的联网多人游戏项目里面会使用到;
  • Server:只包含服务器的代码,在一些UE4的联网多人游戏项目里面会使用到。
总结来看

  • 在日常编辑器中的开发时,如果需要对一些代码进行比较细致的调试,如果Development Editor无法解决,那就尝试使用Debug Editor或者DebugGame Editor;
  • 在仅编译可执行程序时,应该选用Empty目标的编译选项,不过需要提前在编辑器中对游戏项目进行烘焙(Cook),因为IDE中的编译并不会对游戏项目的素材进行处理(看成是数据包部分);
  • Shipping用于发布,性能最好,Test用于在Shipping的基础上进行最小程度的后续测试。
2 Hot Reload?Live Coding!



当使用XXX Editor的选项进行编译运行后,会启用编辑器打开当前的游戏项目,你可以在其中对游戏进行配置、搭建等等,如果只是对里面的一些蓝图进行修改,还是可以只通过Compile编译按钮来解决,但是如果修改了C++代码呢?你可能会发现编译按钮也能帮你把C++里面的修改实时反应到编辑器里。


这其实归功于UE4中的热重载(Hot Reload)功能,在没有这个功能前,C++项目的开发只能先关掉编辑器,然后重新在IDE中编译项目,再重启编辑器,这一套流程想想也是非常耗时的(要不然为什么有蓝图呢?)。
在这些情况下你会触发UE4编辑器的热重载功能:

  • 在编辑器(Editor)打开的情况下,在IDE中编译项目(仅编译项目);
  • 使用编辑器中的编译(Compile)按钮;
  • 在编辑器中新建一个C++类(可以不启用)。
热重载的功能无疑加快了开发的速度,但在使用过程中,大家也陆续发现了不少问题,比如在一些特定操作流程下,热重载会导致一些与修改过的C++代码相关的蓝图保存后,关闭编辑器重启,会看到这些蓝图其中的内容和保存前并不一样(更多情况下是失效了,只能通过版本回退来解决),尽管热重载在大多数情况下表现正常,但其中存在的问题对很多人来说还是有不少的影响。


UE4也是为了有一套更加“完美”的C++开发方案,在4.22版本推出了另一种方法:Live Coding(实时编程?),在编译按钮的下拉栏中可以看到这个方法默认没有被启用,“目前”这还是一个实验中(Experimental)的方法(最新的UE5中也仍然是),但在大家的试用下,这已经是一套比较稳定的方法了。
Live Coding是UE4基于Live++技术开发的一套实时编译方案,这项技术能保证修改的C++代码在编辑器中实时正确编译,并且不会有热重载那样会导致各种各样的隐藏问题,这项技术甚至能让你在编辑器运行游戏(PIE,Play in Editor)时,让修改的代码内容实时反应到运行的游戏中。


在Compile中开启Live Coding后,需要手动地在IDE中重新编译一遍项目,以确保热重载生成的相关文件被清除(Build日志中可以看到上面的日志内容)。


编译项目并重启编辑器会看到会多出一个Live Coding的CompileLog窗口(可以设置隐藏),在你修改完项目中的C++代码后,按下Ctrl+Alt+F11就可以启动Live Coding的编译流程,然后只需要等待编译结束(编译失败并不会导致崩溃,会提示错误信息),修改的内容就会实时地反应到编辑器中,这个快捷键是全局的,无论是否在编辑器,这个快捷键都可以触发启动,你也可以手动地点编辑器中的Compile按钮来启动,这并不会触发热重载,因为这时热重载已经被关闭了。
但这个技术被叫做实验性也是有一定原因的,在UE4中还是有一些限制,比如:

  • 难以实时修改.h头文件中的代码;
  • 难以实时修改.cpp文件中的类构造函数。
难以实时修改仅仅指的是他们的修改和编译很有可能无法反应到编辑器中,并不会导致编辑器崩溃,也不会干扰正常编译,只是不会达到预期效果,从而让你感觉出了Bug似的。想要这些修改内容生效的话,就需要关闭编辑器,在IDE中重新编译一遍项目,再使用编辑器打开,这也是Live Coding目前来看唯一的“不方便”了,但足以应付绝大多数的开发情况(初期搭建项目结构的时候会头疼一点,推荐使用热重载)。


Live Coding的这些问题,目前看来有希望在UE5中逐步解决,在新的UE5中已经加入了Reinstancing技术来改善这一问题,具体可以看UE5的官方文档。
总结来说

  • 热重载(Hot Reload)仍然是UE钦定的默认编译方式,毕竟在大部分情况下他都是正常的,适合在快速项目初期进行使用,避免反复的重启编辑器,拖延开发进度,但这一功能在未来大概率是会被UE淘汰掉的;
  • Live Coding能够较为完美的完成任务(在一定的限制条件下),它甚至能在游戏运行时编译代码修改的内容,编译速度更快,这一方式将随着问题的解决而逐渐成为主流。
3 如何不编译引擎源码?

对于那些仅仅使用Epic启动器安装引擎的开发者来说,可以忽略这一小节,因为这个问题只会出现在自己编译UE4源码的时候…
编译引擎源码通常需要很长时间,性能差一点的花个小半天,性能好一点一个小时以内(主要取决于CPU核心数量和硬盘访问速度),当你编译好引擎源码后,使用引擎创建一个C++项目,然后使用IDE打开这个项目,一切照常,当你点下开始编译的按钮后,奇怪的事发生了:怎么又开始重新编译引擎了!


这是为什么呢?参考文章《定制UE4引擎,如何避免…》,可以发现这主要是因为预编译版引擎和源码编译版引擎在创建项目时,创建项目工程文件时有不同的操作,如果是源码编译版引擎,则会在项目工程中引入引擎的所有工程(如下图)。


那么如何避免呢?还是有方法的,参考文章里的原理,引擎在创建项目时,会判断引擎是预编译版本(Binary Build)还是源码编译版本(Source Build),判断的方法是检测引擎%Engine-Folder%\Engine\Build路径下的文件夹里是否有以下两个文件之一:

  • InstalledBuild.txt:代表是预编译版本;
  • SourceDistribution.txt:代表是源码编译版本。



文件本身是空的,其实改一下名字就行(其实可以写个脚本),修改文件名过后,游戏项目工程本身还是没有修改的,所以还要重新生成一下游戏项目工程,右键项目的.uproject文件,选择Switch Unreal Engine Version,然后就会自动生成新的工程文件,Rider中会检测到文件更新,并更新项目结构(VS还没有测试过),切换到Binary Build下的项目就不会再引入引擎的编译了。
参考文献


  • [1]Shadowriver, Differences between build configurations, UE4-Forms
  • [2]UE4官方文档, 编译游戏项目
  • [3]风之神韵老师, UE4的编译配置详解
  • [4]Unreal Engine Community Wiki, Hot Reload and Live Coding
  • [5]UE5官方文档, Live Coding
  • [6]天空游荡的鱼, 定制UE4引擎,如何避免C++项目重编引擎

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-5-11 09:01 | 显示全部楼层
楼主这是程序美术 两肩一起挑啊[调皮]
发表于 2022-5-11 09:09 | 显示全部楼层
配图好评[赞同]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 10:48 , Processed in 0.092892 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表