Unity C#热更新系列(1)-性能测评
一、准备工作笔者首先调研了市面上现有的热更新方案,诸如各种版本Lua,InjectFix,ILRuntime等,笔者比较喜欢的方式偏向于C#的更新,主要看了下InjectFix与ILRuntime,InjectFix运行时比ILRuntime轻量,但是比较偏向与修复不注重纯C#热更新开发。ILRuntime适合增量开发,运行时依赖Mono库有些笨重,奈何笔者太菜,不熟悉Mono库,所以打算自己捣鼓一下,让ILRuntime运行时不那么笨重,期间花费了大量的时间去探索一个合适方式(此处省略几篇文章的内容,主要还是太菜了做了很多无用功,暂不详述了),而且ILRuntime真香~,有现成的为毛不用呀,非要自己作~。
测试Unity版本:Unity 2020.3.9
前排多图预警,因笔者第一次写,有不足的地方,评论区见~
二、测试用例
经过准备工作的折磨,终于还是扛不住真香定律,有现成的为啥子不用呢,首先直接下载一个
关于ILRuntime介绍
C#的性能测试用例脚本
有了测试用了,首先插入自己库,添加需要做性能测试的代码,生成需要的Wrap文件
自己精心准备烂库
性能测试框架层的代码与生成的Wrap文件
一些系统的Wrap文件,加速调用
在工程中添加更新DLL,依赖框架层
在数据提取器中添加标记需要热更新的DLL为UpdateTest与存储路径
因暂未支持全反射,在测试方法上加入外部调用标签,可以通过名称从外部调用
修改Demo中性能测试方法,添加我的插件调用,与Mono原生调用做性能对比
在加载LUA的时候初始化我的热更新数据
三、执行前准备
1. 我们需要将测试环境切换未Release模式,否则解释器性能影响很大,还好Unity为我们留有快捷按钮。
切换到Release模式
2.为工程添加上 DISABLE_ILRUNTIME_DEBUG 宏
添加宏
3.将打包模式切换到IL2CPP,并且为Release模式
设置打包为IL2CPP-Release
四、编辑器下结果
挑几个比较有说明的测试用例,简单说明一下
1.用例TestMandelbrot结果
用例TestMandelbrot
结论:ILRuntime比xLua计算性能要差点点,【将部分计算提取出来放置在C#端能提升ILRuntime的性能,这句话当我胡说的,详见打包版结果,这知乎的删除线咋个搞得哟?】。PS:此项源码有点长,无源码配图,需要知道内容见源码。
2.用例Test3结果
用例Test3
结论:ILRuntime在调用C#原生的方法时会比xlua好点点但是也不是很明显好,此情形下与原生消耗也比较贴近。
3.用例Test8与Test9的结果
用例Test8
用例Test9
结论:测用例再次说明xlua计算性能比ILRuntime好(估摸着有几倍-1几倍的差距),但是xlua在大数据的计算下精度会有点问题,结果可能与Mono中表现不一致,如果工程中有比较大的数值计算,xlua就不适合了。
4.用例Test10
用例Test10
结论:此用例充分体现MonoJit的厉害之处,当它发现Performace.TestFunc1是空函数后,直接就不执行了,这说明ILRuntime还有优化空间。
五、打包测试
当前采用 https://www.zhihu.com/equation?tex=%7B%5Ccolor%7Bred%7D%7BPC%E4%B8%8B%E7%9A%84IL2CPP%E6%A8%A1%E5%BC%8F%7D%7D 出包,可能与Android/IOS下的测试结果有不同 https://www.zhihu.com/equation?tex=%7B%5Ccolor%7Bred%7D%7B%EF%BC%88%E5%B0%B1%E6%98%AF%E4%B8%8D%E5%90%8C%EF%BC%8C%E5%B7%AE%E8%B7%9D%E5%BE%88%E5%A4%A7%EF%BC%8C%E8%A7%81%E5%AE%89%E5%8D%93%E8%A1%A5%E5%85%85%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%EF%BC%89%7D%7D ,打包后就没有Mono计算耗时,因为热更新工程在打包的时候不会随包打包。以下是打包后各用例结果:
用例TestMandelbrot
特表说明:测打包后结果有点出乎我的预料,ILRuntime纯解释执行比插入了部分原生函数快了一些。编辑器下得结论打脸了,啪啪啪得响~~,有知道原因得大神望能评论区告知一下。而且此测试用例编辑器下比IL2CPP慢了好几倍,虽说IL2CPP有所提升,但是通过后面用例得结果来看,也不会出现查好几倍得情况,如有知道得大神还望指教。
其他得用例结果
编辑器与IL2CPP对比照1
编辑器与IL2CPP对比照2
编辑器下与IL2CPP对比照3
结果:总的来说无论是xlua还是ILRuntime,IL2CPP后会比编辑器下性能有所提升(xlua主要可能在PInvoke上的提升,ILRuntime是Mono与IL2CPP的差异)。
结论汇总:xlua计算性能比ILRuntime好(估摸着有几倍-1几倍的差距),但是xlua在大数据的计算下精度会有点问题,结果可能与Mono中表现不一致。ILRuntime在调用C#原生的方法时会比xlua好点点但是也不是有很大很大的差距,不会像纯计算那样可能会有1个量级的差距.
ILRuntime官方介绍
官网原话,此测试用例中,"均"已超过,我测试的13个用例中只有6个用例超过xlua一点点,还没达到一半,是否是我哪儿设置有问题?有知道的大神能否告知一哈~,开始我以为是ILRuntime的热更dll问题,毕竟Github上直接下载下来的dll是Debug版本的,我编译了一个Release版本的替换后,发现ILRuntime执行时间相差不大,这充分说明ILRuntime作者牛逼之处,能把Debug的版本优化到跟Release无多大差别。毕竟Mono的Debug版本与Release版本性能相差2倍~~
https://www.zhihu.com/equation?tex=%7B%5Ccolor%7Bred%7D%7B%E6%9F%A5%E8%AF%81%E5%8E%9F%E5%9B%A0%E4%B8%BAPC%E7%AB%AF%E7%9A%84LUA%E6%AF%94%E6%89%8B%E6%9C%BA%E7%AB%AF%E5%8E%89%E5%AE%B3%E5%BE%88%E5%A4%9A%EF%BC%8C%E6%89%8B%E6%9C%BA%E7%AB%AF%E4%B8%8B%E7%AC%A6%E5%90%88ILRuntime%E7%9A%84%E5%AE%98%E7%BD%91%E6%8F%8F%E8%BF%B0%EF%BC%8C%E8%BF%BD%E5%8A%A0%E6%89%8B%E6%9C%BA%E7%AB%AF%E7%9A%84%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C%7D%7D
安卓IL2CPP测试截图1
安卓IL2CPP测试截图2
安卓IL2CPP测试截图3
结论:在安卓平台下的表现部分Case相差不大,部分Case ILRuntime能吊打xlua。在安卓上的结果比较符合官网对性能的描述。经过事实证明,不在需求环境下谈性能,都是耍流氓。
六、写在最后
感谢ILRuntime与xlua作者让我能在这儿吹牛,对于我第一篇文章有所不足之处,望大家指正。因多次运行也会有不一样的结果,所以以上测试用例得数值是一个比较常出现的数值情况。
“预览看到图糊了,不改了,大家费眼了~~~~”
最后感谢公司不加班,让我有时间在这儿闲谈。也欢迎各路大神来我司投递简历hr@pathea.net
下期预告: Unity C#热更新系列(2)-通用MonoBehaviourAdapter实现
更新时间未知,年前会很忙了~ 最真实的性能对比不如看ILRuntime作者自己做的对比lua的测试结果,你这个完全不对
ILRuntime在做了CLR绑定,打了Release包,开启JIT模式下,真机调试,性能才是最好的,而且根据ILRuntime作者做的性能测试,结果无疑丝毫不逊色于xlua,某些方面甚至吊打 你只给xlua做了warp,没给ILRuntime做自动分析绑定,做一下就起飞了,而且ILRuntime不知道你用的哪个版本,如果是最新的2.0.2的话,开启寄存器模式的话才能飞得更高。 通篇都是一副压根没弄明白用法的测试,建议有问题加官方群问问,别自己半桶水还在这误导人 感谢大神指点,本次测试直接采用的作者提供的Demo,Demo上已经做个绑定生成了,未修改Demo任何内容,只是加入了自己的额外数据测试而已,所以ILRuntime的绑定文件Demo原本已具备了。而且也是再寄存器模式下测试的哟,但运行时版本是2.0.0-preview-12,我同步了Demo的最新版本,与之前运行时间也没有新的提升,还有其他需要配置的地方? 感谢大神回复,测试Demo是作者提供的Demo,未作任何更改,并且是在Release,且采用加载寄存器模式运行的,可能是我用得不对吧,还望指点。 可以在unity官方的unity学堂内买一份ILRuntime作者做的视频,里面对性能优化讲的很详细,同时有ILRuntime作者写的完整测试流程和讲解 感谢大神得指点,我找到问题根本了,不是用法问题,是本测试PC下测试,所以测试结果与手机端不同,照成了PC端下ILRuntime不如lua的问题,PC端的lua比手机端牛逼多了~,后面我红字标识一下,再补上手机端测试结果~ 感谢大神指点,确定问题了,并非用法问题,是测试时打包的PC端,所以结果跟官网描述不一样,PC端的lua比手机端的牛逼些~ 这个是JIT的问题我记得,但是在手机端ILRuntime并不差于lua
页:
[1]