前言

我们有一个Unity纯C#开发的mmo项目(使用ILRuntime热更,开发阶段跑纯C#),在开发到后期之后,每次修改C#代码编译时间在25秒左右,这部分的等待时间是很长的, 我在想有没有办法可以缩短这个编译时间。

编译dll时间分布:

  1. assembly-csharp 20s
  2. assembly-csharp-editor 0.88s
  3. assembly reload 4.08s

如果把逻辑代码,抽离出来不放在Unity的目录下,通过visual studio编译这部分代码花费10s,抽离之后Unity编译时间为5s。也就是热更代码放Unity之后 assembly reload的时间变长了很多。

项目代码构成:

  1. 不可热更代码,放在Unity的Asset目录
  2. 可热更代码也是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的编译时间:

  1. 把第三方库或不常改动的代码放到 Standard Assets或Plugins 目录下,这两个目录下的代码会最先编译,且不能依赖于外部其它脚本

  2. 尽可能多的使用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

提高Unity编译dll的速度的更多相关文章

  1. iOS进阶--提高XCode编译速度、Xcode卡顿解决方案

    提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...

  2. Unity 编译apk启动出异常

    问题:unity 编译出来的apk,在android安装启动,时报以下错误: 07-06 20:52:48.282: E/linker(18229): load_library(linker.cpp: ...

  3. 【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    作者:Williammao, 腾讯移动客户端开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/290.h ...

  4. Unity编译Android的原理解析和apk打包分析

    作者介绍:张坤 最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用Android的部分原理进 ...

  5. 【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

    引言 原则1尽可能地使用属性而不是可直接访问的数据成员 原则2偏向于使用运行时常量而不是编译时常量 原则3 推荐使用is 或as操作符而不是强制类型转换 原则4 推荐使用条件属性而不是if条件编译 原 ...

  6. 【转】Effective C#观后感之提高Unity中C#代码质量的21条准则

    转自:http://blog.csdn.net/swj524152416/article/details/75418162 我们知道,在C++领域,作为进阶阅读材料,必看的书是<Effectiv ...

  7. Delphi编译dll时出错"Cannot debug project unless a host application is defined.use the run|parameters...dialog box."

    问题: 在编写DLL程序的时候,按下F9或者按下那个绿色的箭头,会报错,如下 原因: 是因为你按下的F9或者那个绿色箭头是表示“Run”这个程序,但是DLL不是可执行文件,所以当然不能够运行,所以就会 ...

  8. 如何提高Lucene构建索引的速度

    如何提高Lucene构建索引的速度 hans(汉斯) 2013-01-27 10:12 对于Lucene>=2.3:IndexWriter可以自行根据内存使用来释放缓存.调用writer.set ...

  9. 提高NetBeans的代码提示速度.md

    NetBeans配置 如何提高NetBeans的代码提示速度,打开下面的文件然后配置 **C:\Users\ylg\AppData\Roaming\NetBeans\8.2\config\Editor ...

  10. Unity编译时找不到AndroidSDK的问题 | Unable to list target platforms(转载)

    原文:http://www.jianshu.com/p/fe4c334ee9fe 现象 在用 Unity 编译 Android 平台的应用时,遇到 Unable to list target plat ...

随机推荐

  1. Linux 创建新用户

    添加用户组[root@VipSoft ~]#groupadd admin 添加用户[root@VipSoft ~]#useradd jimmy -m -d /home/jimmy -g admin 修 ...

  2. Spring Cloud 和 Dubbo 哪个会被淘汰?

    今天在知乎上看到了这样一个问题:Spring Cloud 和 Dubbo哪个会被淘汰?看了几个回答,都觉得不在点子上,所以要么就干脆写篇小文瞎逼叨一下. 简单说说个人观点 我认为这两个框架大概率会长期 ...

  3. AtCoder ARC 115 E - LEQ and NEQ (延迟标记线段树 or 笛卡尔积 + DP维护)

    问题链接:Here 长度为 \(N\) 的数列 \(A_1,-,A_N\) .回答满足以下条件的长度 \(N\) 的数列 \(X_1,-,X_N\) 的个数除以 \(998244353\) 的余数. ...

  4. 一套前后台全部开源的H5商城送给大家

    博主给大家推荐一套全部开源的H5电商项目waynboot-mall.由博主在2020年开发至今,已有三年之久.那时候网上很多的H5商城项目都是半开源版本,要么没有H5前端代码,要么需要加群咨询,属实恶 ...

  5. freeswitch的事件引擎实现分析

    概述 freeswitch是由事件驱动的,fs内部有各种事件来标识状态的变化包括呼叫的变化.配置的变化.号码的变化等等. 而一个框架内的事件引擎需要实现哪些基本的功能呢? 让我们来看一下fs的事件引擎 ...

  6. 运筹学 | 退化的最优解 vs 无穷多最优解?

    退化的最优解: 单纯形表的基可行解中,出现等于零的基变量.或者,按最小比值来确定出基向量时,存在两个以上相同最小比值. 出现的原因:模型中存在多余的约束. 无穷多最优解: 单纯形表中,按最大检验数 σ ...

  7. Shell 脚本编程学习

    本文为博主原创,转载请注明出处: 目录: 1. shell 变量 2. 运算符 3. if 语句 4.for 循环 5.while 语句 6. case 语法 7.跳出循环:continue 与 br ...

  8. linux 查看服务器cpu 与内存配置

    转载请注明出处: 1. 通过 lscpu 命令查看 服务器的cpu 配置 显示格式: Architecture: #架构 CPU(s): #逻辑cpu颗数 Thread(s) per core: #每 ...

  9. Mongo库表占用空间统计

    1. 背景 DBA同事反馈说Mongp集群磁盘占用空间过大,超过监控告警95%阈值,因此建议删除部分资源或者申请扩容,本着开源节流的理念,还是乖乖看哪些老数据应该删除.但Mongo中的库和表过多,因此 ...

  10. Python追踪内存占用

    技术背景 当我们需要对python代码所占用的内存进行管理时,首先就需要有一个工具可以对当前的内存占用情况进行一个追踪.虽然在Top界面或者一些异步的工具中也能够看到实时的内存变化,还有一些工具可以统 ...