资讯详情

Unity接入ILRuntime时需要注意的问题

研究了一段时间ILRuntime做热的方式比较好,整体感觉还不错,但是官方技术文档不是很详细,说明了重点问题,但是出现了bug情况多种多样。在这里,我将记录我遇到的问题。如果描述错误,请纠正。

(以下把Unity3D脚本记录在工程中Unity,把热更多的脚本C#工程记为Hotfix)

1、Unity调用Hotfix方法,费用比较大。这里抽象比喻一下,如果同时调用10万次,Unity调用自己方法的费用为1,那么Hotfix调用Unity方法的开销大约为5,Unity调用Hotfix方法的费用大概是20,这只是我的比喻,不误导你。这里解释一下,同时调用一次方法和调用一万次方法的差距会有所不同,比如调用一次方法,费用0.0001ms与0.01ms可以忽略不计。而且在Unity编辑器中的测试结果与真机测试结果有偏差,官方说明如果要比较ILRuntime和Lua请在真机上测试性能。

2、Hotfix中调用Unity数据结构和API尽量不要调用泛型相关,因为泛型会使用不同的数据类型。这在官方文件中有说明。

3、Unity中调用Hotfix中的static方法,不需要实例参数。但调用非static方法需要传递所在类的实例(实例为new一类对象)。官方文件也有说明。

4、Unity多次或频繁调用Hotfix尽量缓存方法IMethod,然后再用Appdomain调用可以减少获取方法的费用。尽量不要在那里Unity脚本的Update方法中调用Hotfix这样会相对降低性能(注意只是相对的,如果是轻量级应用基本可以忽略)。

5、Unity中运行Hotfix中国的方法过的CLR重定向机制操作。这里有一个严重的坑,就是不要在Hotfix类中写法的重载存在于一个类中Check(string name)和Check(string name, Type type),不管Check方法是在Unity中调用还是Hotfix中调用,可能会有意想不到的异常,这个bug我查了很久才发现。我遇到的异常信息如下:

TypeLoadException: Failure has occurred while loading a type. ILRuntime.Runtime.Intepreter.ILIntepreter.Execute (ILRuntime.CLR.Method.ILMethod method, ILRuntime.Runtime.Stack.StackObject* esp, System.Boolean& unhandledException) (at Assets/ThirdParty/ILRuntime/ILRuntime/Runtime/Intepreter/ILIntepreter.cs:2092) Rethrow as ILRuntimeException: Failure has occurred while loading a type. IL_0001: ldtoken T

6、Hotfix中继承Unity需要写的类别或接口Adaptor适配器;Hotfix调用Unity委托中带参数需要注册委托参数RegisterMethodDelegate;Hotfix中调用Unity中非Action和Func委托,需要注册委托转换器,如使用UnityAction。这些都在ILRuntime的官方Demo中有说明。

7、关于CLR重定向和CLR不需要深入了解绑定,因为ILRuntime已提供直接生成CLR重定向代码的工具。这里说明一下CLR绑定,我们可以直接调用这行代码:ILRuntime.Runtime.Generated.CLRBindings.Initialize(appdomain);,这其实是用的CLR重定向原理。Hotfix可直接调用Unity类似引用的方法Unity脚本程序集是一样的,如果不提前进行CLR绑定,那么开销增加十倍甚至更高,所以CLR绑定是为了提高性能。官方Demo也说明了,CLR绑定会产生更多C#代码最终会增加包体和Native Code内存消耗,特别是在较大的工程项目中,所以只能添加常用类型和频繁调用的接口。例如Unity中一个Test类,整个生命周期只在Hotfix中调一次,完全可以不用CLR绑定。但一定要记住CLR绑定注册写在CLR重定向注册后,因为同样的方法只能重定向一次,只有先注册的才能生效。

8.洗澡睡觉,未完待续……

标签: ilme重型连接器ag

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台