分享一个加速Unity工程C#编译的方法
这个是最近一段时间带着子川一起做的一个小东西:如何优化大项目C#编译速度。这个idea主要是因为使用了slua之后,每次修改C#部分编译实在是太慢了… 下面将介绍直接介绍一个简单思路来优化之 (其他的一些失败尝试和思考我扔在了
自己博客上,包括一键编译cs文件成dll)。
这个思路是来源于在Asset Store上看到的一个插件
Mad Compile Time Optimizer(ps. 后来发现雨松MONO之前也提过这个办法:
让unity的编译速度在快一些)
优化思路
官方文档
Special folders and script compilation order表示引擎默认就会分四步编译,那么只要将不常修改的代码放到特定文件夹就完事儿了其实…这里我选择的是Standard Assets文件夹,因为我们已经有一套切换SDK的脚本会覆盖Plugins内。同样也要修改下slua的载入部分:
//var assemblyName = "Assembly-CSharp";
var assemblyName = "Assembly-CSharp-firstpass";
Assembly assembly = Assembly.Load(assemblyName);
list.AddRange(getBindList(assembly,"SLua.BindUnity"));
list.AddRange(getBindList(assembly,"SLua.BindUnityUI"));
list.AddRange(getBindList(assembly,"SLua.BindDll"));
list.AddRange(getBindList(assembly,"SLua.BindCustom"));
在这里遇到了一个mono编译器的BUG,偷懒起见直接用了
Unity C# 5.0 and 6.0 Integration解决之,测试发现把Slua挪到Standard Assets之后编译时间从15s左右降到5s左右...
ps. 这里只是测试偷懒换了编译器,但是我个人不建议在实际项目里这么干…
项目测试
使用了手头在优化的一个项目:原版编译时间大概23s左右
新版本编译时间大概7s左右
说穿了就是把包括插件在内的基本不会修改的代码挪到Standard Assets里就完事儿了,经常修改的代码放在外面原地不动。这样唯一的一个限制是Standard Assets里的代码无法引用外面的代码,不过我这里全是放的插件,完全没有问题。
附上简单脚本统计编译时间
public class FinishCompiling
{
const string compilingKey = "Compiling";
static bool compiling;
static FinishCompiling()
{
compiling = EditorPrefs.GetBool(compilingKey, false);
EditorApplication.update += Update;
}
static void Update()
{
if(compiling && !EditorApplication.isCompiling)
{
Debug.Log(string.Format("Compiling DONE {0}", DateTime.Now));
compiling = false;
EditorPrefs.SetBool(compilingKey, false);
}
else if (!compiling && EditorApplication.isCompiling)
{
Debug.Log(string.Format("Compiling START {0}", DateTime.Now));
compiling = true;
EditorPrefs.SetBool(compilingKey, true);
}
}
}
编辑于 2016-11-28 23:04