ue4打包问题的巧妙解决——二分回退大法!

时间:2021-07-13 17:04:17

昨天突然发生了一件非常恐怖的事——我的ue4项目居然不能打包了!!

大概是这么一回事:

 UATHelper: 打包 (Windows (64位)): UnrealBuildTool: ERROR: Non-editor build cannot depend on non-redistributable modules
我试了一下在vs里用development而不是developmenteditor生成结果出现了这么一说:
ue4打包问题的巧妙解决——二分回退大法!
 
于是我大概猜测到应该和非编辑器build模式(也就是打包)不能依赖于umgeditor有关的不可再发行模块。
但具体要怎么解决还是无从下手,我尝试了删掉临时文件重新generate code,rebuild项目都没卵用,根据unreal wiki上的问答把build.cs文件魔改了一通也没能成功。。
于是二分回退大法就要闪亮登场了!

众所周知,程序员除了print111111大法以外,还有一项独门秘技,叫做二分查错法。

也就是一段程序有问题但不知道问题在哪里的时候,注释掉后半段看看还有没有问题,如果不出错了说明问题在后半段反之问题在前半段,以此类推,不断缩小范围。。。直到找出有问题的行。

二分查错法的升级版是我独创的(?)二分优化法,如果游戏出现蜜汁卡顿,(前提是先确定是逻辑线程耗时过长)同样是先注释掉一大段代码,用二分法不断缩小范围,直到找到卡顿的代码行。

然而现在又有升级版了,叫做二分回退大法!可以解决一些非常严重但就是找不到原因的问题。

二分回退法和传统的二分法不同,它是时间上的二分而不是空间的。

首先我们需要有时不时提交到版本控制的好习惯,我用的是微软的vsonline team foundation service,具体怎么和ue4结合进行源码管理我以后会单独写篇文章介绍。

具体做法就是把项目回退到记忆中可以打包的版本(l表示),然后取当前版本已知不可打包版本(r表示)到当前已知可打包版本的一半(时间上的一半,(l+r)/2)再进行回退,尝试打包,如果不能打包说明导致不能打包的那次修改的范围在l~(l+r)/2,否则在(l+2)/2~r。。。

以此类推,最终我发现了ue4打包问题的巧妙解决——二分回退大法!changeset 375可以正常打包,而之后的376突然就打包失败了!!

真相就在眼前!!!

我点开#376,

ue4打包问题的巧妙解决——二分回退大法!

赫然看到uproject文件多出了一行umgeditor!!!

尼玛,这不就是前面那个link出错的umgeditor什么什么lib文件嘛!!!

震惊了,原来是uproject多了这么一行导致打包需要多弄这么个模块。

于是我又回到了最新版本,把uproject文件用记事本打开,删掉了umgeditor这行,果然伴随着清脆的一声滴,打包成功了!!!

至于为什么会莫名其妙多出这一行呢,原来是我当时试图添加一个继承widgetcomponent的c++类,结果没能添加成功,我也就没当一回事,没想到埋下了如此伏笔。

所以这个故事告诉了我们至少3点:

1.如果ue4打包失败就去检查一下.uproject文件

2.使用版本控制并经常check in 的好处

3.二分回退大法的妙用