目前市面上流行的热更方案就是lua系列和ILRuntime,选取哪一种需要根据自己的项目进行比对。
无论是ILRuntime还是toLua都是市面上有在用到的热更方案。直观上来讲,都可以通过把代码放在StreamingAssets中,从而达到热更的目的。
本文旨在从迁移成本、运行效率两方面来进行比对两者间的差异。
一般Unity都是C#编写的,所以单看迁移成本,ILRuntime是完胜。
这一点不需要做太多解释。
本文的比对主要是一些基本功能的比对,Unity版本:5.6.6 f2 。
测试工程地址:https://git.dev.tencent.com/Cyf649669121/ILRuntimeVStoLua.git
方便阅读,不能热更的代码(写死在Unity里面的代码)同意叫做Mono代码;热更新的代码(Lua或者ILRuntime)都叫做热更代码。
(注:ILRuntime的工程都已经定义过宏 DISABLE_ILRUNTIME_DEBUG 。)
测试1、Mono代码调用热更代码:
在Lua和ILRuntime中各写一个空方法,然后在Mono中调用10000次。
可见ILRuntime耗时是toLua的10倍左右……
测试2、热更代码调用Mono:
在Lua和ILRuntime中各写一个循环,调用Mono某函数10000次。
这个更不得了了,ILRuntime比toLua慢了20倍不止。
但是有一个要提出来,就是IL的循环很有问题。这个在测试3中很明显。
测试3、热更代码的循环计算:
在Lua和ILRuntime中各写一个方法进行1万次循环计算,然后用Mono调用一次。
也就是说一次调用,在IL里面For循环10000次就是这种情况。感觉非常之奇怪,因为他的计算量并没有这么大(见测试4)。
测试4、测试3中的方法在C#中的耗时
将测试3中在Lua或者ILRuntime写的1万次循环计算的方法写成C#在Mono中调用,看他在Mono中的耗时情况。
可见这个1万次的加法计算耗时很少的,就是IL慢而已,而不是C#慢……
结论:
其实只是测了一些基本的方法,IL和Lua的很多高级的操作都没测试过。感觉这性能差得有点多啊,按理说不应该啊。官方自己的介绍(http://ourpalm.github.io/ILRuntime/public/v1/guide/index.html)说的是比Lua快了10~20倍,我咋完全没发现快在哪里……难道是我的使用方法有问题?
另外从另外一个大佬的博客《Unity中SLua、Tolua、XLua和ILRuntime效率评测》来看,虽然也出现了走循环IL巨慢的情况,但其他几个模块看起来还是核Lua系列各有千秋,不至于像我测出来的这样被Lua全方位吊打……
在多嘴一句,刚看了一个大佬写的体验(https://www.sohu.com/a/227068353_667928),也是说的For循环的问题。但是他又说:
“其中大多都是进行一个很大数量的for循环,以此来判断;但是我认为这样来评判一个框架的性能,是不准确的;因为在实际项目中。没有人会单单进行for循环,什么事情都不做的;”
哈哈哈,怕就是说的我这种人……
Lua反正是市场早就验证过了的,肯定兼容是过关的。ILRuntime比较新,但是从现有的消息来看应该是PC、Android、IOS 都可以用的。
以下内容来自各地道听途说,本人没有验证过,不负任何责任。
1、据说ILRuntime 如果用大量的byte之类的数据转换在android时常会出错。
2、据说ILRuntime偶发行号定位不准(打个空格就变了)。
3、目前ILRuntime的IL2CPP打包有Bug,不会执行静态构造函数。
我个人而言还是很想用ILRuntime的,毕竟用C#啊……
但是这个速度……怕是还有很多的优化空间,可能需要进一步地改良。