常见问题解答
优质
小牛编辑
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
宏