首发于魂世界

分享一个加速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