1. 程式人生 > >ue4打包問題的巧妙解決——二分回退大法!

ue4打包問題的巧妙解決——二分回退大法!

set window 一個 http 打開 modules tool end unreal

昨天突然發生了一件非常恐怖的事——我的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+2)/2~r。。。

以此類推,最終我發現了技術分享changeset 375可以正常打包,而之後的376突然就打包失敗了!!

真相就在眼前!!!

我點開#376,

技術分享

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

尼瑪,這不就是前面那個link出錯的umgeditor什麽什麽lib文件嘛!!!

震驚了,原來是uproject多了這麽一行導致打包需要多弄這麽個模塊。

於是我又回到了最新版本,把uproject文件用記事本打開,刪掉了umgeditor這行,果然伴隨著清脆的一聲滴,打包成功了!!!

至於為什麽會莫名其妙多出這一行呢,原來是我當時試圖添加一個繼承widgetcomponent的c++類,結果沒能添加成功,我也就沒當一回事,沒想到埋下了如此伏筆。

所以這個故事告訴了我們至少3點:

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

2.使用版本控制並經常check in 的好處

3.二分回退大法的妙用

ue4打包問題的巧妙解決——二分回退大法!