ue4打包问题的巧妙解决——⼆分回退⼤法!
昨天突然发⽣了⼀件⾮常恐怖的事——我的ue4项⽬居然不能打包了!!
⼤概是这么⼀回事:
UATHelper: 打包 (Windows (64位)): UnrealBuildTool: ERROR: Non-editor build cannot depend on non-redistributable modules
我试了⼀下在vs⾥⽤development⽽不是developmenteditor⽣成结果出现了这么⼀说:
于是我⼤概猜测到应该和⾮编辑器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+r)/2~r。。。
以此类推,最终我发现了changeset 375可以正常打包,⽽之后的376突然就打包失败了!!
editor版本真相就在眼前
我点开#376,
赫然看到uproject⽂件多出了⼀⾏umgeditor
,这不就是前⾯那个link出错的umgeditor什么什么lib⽂件嘛
震惊了,原来是uproject多了这么⼀⾏导致打包需要多弄这么个模块。
于是我⼜回到了最新版本,把uproject⽂件⽤记事本打开,删掉了umgeditor这⾏,果然伴随着清脆的⼀声滴,打包成功了
⾄于为什么会莫名其妙多出这⼀⾏呢,原来是我当时试图添加⼀个继承widgetcomponent的c++类,结果没能添加成功,我也就没当⼀回事,没想到埋下了如此伏笔。
所以这个故事告诉了我们⾄少3点:
1.如果ue4打包失败就去检查⼀下.uproject⽂件
2.使⽤版本控制并经常check in 的好处
3.⼆分回退⼤法的妙⽤