常见问题解答

优质
小牛编辑
134浏览
2023-12-01

版本

Unity2018.3以上需要用最新ILRuntime。
最新的发布版本为V2.0,Unity2018以上可通过Package Manager方式安装
V1.4已过时,示例工程内的版本已过时,当前最新版本为master分支。

ILRuntime的性能到底怎么样

最新版ILRuntime在若干若干测试用例中,包括大规模数值计算的场景,均已超过Lua53版xlua,详细测试可参考 U3D Demo工程

编辑器内的常见问题

我要怎么才能在Profiler里看见热更内的方法耗时情况呢?

在ILRuntime的初始化处加入以下代码即可在Profiler中看见热更内方法的耗时情况,无需开启DeepProfile,真机上也可使用

#if DEBUG && !NO_PROFILER
//由于Unity的Profiler接口只允许在主线程使用,为了避免出异常,需要告诉ILRuntime主线程的线程ID才能正确将函数运行耗时报告给Profiler
appdomain.UnityMainThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId;
#endif

运行出现报错ObjectDisposedException: Cannot access a closed Stream

加载dll的流被关闭了。新版要求流不能关闭,也不能用using写法。新的用法请参见Demo示例

运行时出现Cannot find Adaptor for: xxxxxxxxx

热更当中跨域继承了xxxxxxx类型,但是没有注册对应的适配器

打包后出现问题

用mono打包的时候,ILRuntime相关的功能都正常,改用IL2Cpp之后,注册的所有委托都不执行了?

  • 注册委托只能写在主工程里,不能写在热更工程里。
  • 检查是否做了CLR自动分析绑定

ExecutionEngineException: Attempting to call method ‘Scene::GetModule’ for which no ahead of time (AOT) code was generated.电脑运行没问题,安卓上报这个错

  • 检查是否做了CLR自动分析绑定
  • CLRBindings.Initialize(appdomain); 要调用这一句,放在最后.是否漏了这句。

KeyNotFoundException: Cannot find Type:System.Boolean modreq(System.Runtime.CompilerServices.IsVolatile), 在使用了volatile关键字后报这个错

  • ILRuntime不支持直接跟操作系统或者硬件资源打交道的用法,包括unsafe, volatile, P/Invoke,请删除volatile 关键字

真机上调试或运行时出现随机闪退

  • 请确认XCode的编译选项中是否使用了Debug,由于iPhone的线程栈空间很小,调用层级稍微深一点就会出现爆栈,因此请使用Release选项编译XCode工程

使用ILRuntime后产生的性能问题

使用ILRuntime后产生的GC Alloc比用之前大和很多啊,为什么

  • 请先确保发包之前做过CLR自动分析绑定,请一定要注意是自动分析,而不是手动给type列表进行绑定
  • 如果热更里的脚本使用了比较多的值类型局部变量如Vector3等,请确定是否注册了对应的值类型绑定适配器
  • 是否在热更代码中使用了foreach,由于原理限制,在热更中使用foreach无法避免产生GC Alloc,请使用支持for循环的数据结构,或者用List等支持for遍历的结构辅助Dictionary等无法for遍历的结构
  • 编辑器Development Build的真机包,由于需要支持断点调试和报错打印行号,会有每个方法调用20字节的固定内存分配开销,如果需要分析实际GC Alloc,可在PlayerSettings中定义DISABLE_ILRUNTIME_DEBUG

使用ILRunitme后某个方法调用比之前慢了很多啊

  • 请先确保发包之前做过CLR自动分析绑定,请一定要注意是自动分析,而不是手动给type列表进行绑定, 没有CLR绑定的方法调用会慢几十倍
  • 请确保热更DLL是使用Release方式编译的,Debug编译的DLL会慢3-5倍
  • 请发布非Development Build真机包后再测试耗时,编辑器中和Development Build执行速度会比最终Release包慢几倍
  • 请确保注册了常使用的值类型的值类型绑定
  • 如果需要大规模数学运算,可以通过2.0新加入的寄存器模式对方法进行优化,或将耗时的工具方法放入主工程辅助