前言
我們有一個Unity純C#開發的mmo專案(使用ILRuntime熱更,開發階段跑純C#),在開發到后期之后,每次修改C#代碼編譯時間在25秒左右,這部分的等待時間是很長的, 我在想有沒有辦法可以縮短這個編譯時間,
編譯dll時間分布:
- assembly-csharp 20s
- assembly-csharp-editor 0.88s
- assembly reload 4.08s
如果把邏輯代碼,抽離出來不放在Unity的目錄下,通過visual studio編譯這部分代碼花費10s,抽離之后Unity編譯時間為5s,也就是熱更代碼放Unity之后 assembly reload的時間變長了很多,
專案代碼構成:
- 不可熱更代碼,放在Unity的Asset目錄
- 可熱更代碼也是C#,通過ILRuntime熱更
完整專案的Assembly-CSharp.dll有12.9MB,主要是protobuf的協議和配置表的entity數量非常多,還有非常多的養成系統代碼,因為mmo游戲內容量很大,
當然在這之前我已經嘗試過使用asm,因為這個專案有很多代碼之間是相互依賴的,只有少部分代碼進行asm化了,所以我想嘗試還有沒有其它可以縮短編譯時間的方法,
Unity官方的增量編譯
Unity2018.1官方提供增量編譯插件,見Unity論壇:https://forum.unity.com/threads/unity-incremental-c-compiler-deprecated.523993/
在Unity的manifest檔案中添加以下內容
{
"dependencies": {
"com.unity.incrementalcompiler": "0.0.30"
},
"registry": "https://staging-packages.unity.com"
}
注意:目前官方已廢棄此插件,原因是Unity2018.3中使用的C# 編譯器比以往提高了5倍的速度,官方認為已經沒有必要使用這個插件了,并且移除了這個插件,
而且我在Unity2019.3.7f1中添加上述package無效,
官方移除此插件的原話:https://forum.unity.com/threads/unity-incremental-c-compiler-deprecated.523993/page-9
You should not be using incremental compiler when you are using Unity 18.3. In terms of compilation speed, 18.3 is very very close to Incremental compiler speed and a lot more robust
Unity官方的其它做法
在unity的檔案中還提到這兩種可以減少dll的編譯時間:
-
把第三方庫或不常改動的代碼放到 Standard Assets或Plugins 目錄下,這兩個目錄下的代碼會最先編譯,且不能依賴于外部其它腳本
-
盡可能多的使用asm,在Unity2018.2中已支持,
注意:建議每一個asm中的代碼是獨立的,不依賴于外部,雖然Unity2019之后的版本asm之間可以相互參考
關于asm可以參考我的這篇博客《Unity的asm筆記》
增量編譯或動態加載dll
微軟的Roslyn
通過Roslyn構建自己的C#腳本 看起來像和lua一樣,執行字串就可以執行C#代碼,看起來可以做到在修改C#的情況下不重新Unity Play就能執行,看完文章之后我還沒有去研究,
Roslyn是.NET編譯器平臺,是微軟的一組用于C#和VB語言的開源編譯器和代碼分析API,可以通過傳統的命令列程式使用這些編譯器,也可以通過.NET代碼從本地獲得這些API,Roslyn公開了用于代碼的語法(詞法)分析,語意分析,對CIL的動態編譯以及代碼發出的模塊,
羅斯林(Roslyn)最顯著的主要特征包括:
- 通過API公開為服務的C#和Visual Basic語言的編譯器,
- 用于代碼分析和重構的API ,
關于Roslyn的介紹摘自維基百科:Roslyn(編譯器)
github增量編譯庫
Unity3D.IncrementalCompiler
從提交記錄來看只支持到Unity5,在github找到另一個fork者的庫已支持unity2018,但是clone下來后沒有編譯成功dll,所以放棄了,
網上搜索Roslyn Unity也是只支持到Unity5
插件
Roslyn C# - Runtime Compiler :收費插件,價格20美金
*Requires .Net 4.x API compatibility level*
Roslyn c#允許使用Roslyn編譯器在運行時加載程式集和c#腳本,使您可以輕松地向專案添加modding(改裝)支持或游戲內編程,此外,Roslyn c#還包括代碼安全驗證,允許您指定加載的代碼必須遵守的許多安全限制,包括非法的名稱空間和型別,這使得從未知來源加載第三方代碼更加安全,包括一個基于小程式設計的游戲,其目標是通過撰寫執行方向決策的代碼來導航滑鼠走出迷宮,
查看Unity編譯dll的耗時分布
Compiling Indicator - Wait Relaxed 免費插件,功能介紹:
編譯指示器是一個小的通知視窗,當Unity編輯器開始編譯時彈出,它顯示了編譯的進度和估計的完成時間,您還可以找到占用專案編譯時間最多的程式集,
編譯指示器了解專案的編譯時間,因此,它的估計將會變得正確,因為它經歷了更多的編譯,您所要做的就是等待,直到編譯指示器掌握了足夠的資訊,或者,要重置已學習的資訊,您可以單擊“清除資料庫”按鈕,
使用方法:匯入到Unity之后,當C#代碼有修改時,在右下角會彈出編譯進度,編譯完成之后點擊一下就可以關閉

目前我的做法
放在Standard Assets
經過上面的嘗試之后,目前是把用到的2個插件放在Standard Assets目錄下,對sharpzip進行asm化,編譯時間基本保持在24秒左右,
把框架代碼asm化
框架代碼抽出到獨立目錄中,進行asm化,關于asm可以參考我的這篇博客《Unity的asm筆記》
去掉不使用的package
去掉package.json中不需要用到的庫,我在專案中只留下了package manager ui,時間減少了0.5s
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285775.html
標籤:其他
上一篇:Unity的asm筆記
