[转载]Unity热更方案汇总

Unity热更方案汇总

http://www.manew.com/thread-114496-1-1.html

谈到目前的代码热更方案:没什么特别的要求

image

toLua(效率比sLua高)

打算以传统方式更新,热更仅仅用于紧急更新 / 希望战斗等性能敏感部分也能更新

xLua(性能在Lua系列中一般,但额外支持HotFix,可以更多使用C#代码)

基本上普通的项目也就只能用这两,也就是只有Lua一条路可走。

然而,由于Lua自身缺少编译期间语法检查以及缺乏必要的语言特性,在熟练的开发者手里开发效率和健壮性其实是不如其他强类型语言的。

——这点可能会有异议,我只能这么讲:使用强类型语言的程序员都会有一些增加开发效率和代码健壮性的“小技巧”,但这些技巧必须依附于语言特性以及某些只在强类型语言上才能使用的IDE功能。而且这样做的优势更多体现在项目的后期,也和团队的协作模式有关,没接触到的人可能确实无法理解。

一些人可能会觉得lua比C#更好用,但在另一些人手里C#也确确实实能够比lua提供更多的开发效率,保证更低的BUG概率,你不能因为自己“不知道,不用”,而认为他们的需求不存在。

现有的可使用强类型语言的代替方案如下:

  • 使用ILRuntime解释器(C#解释器)
  • 使用JS解释器(V8),并且使用TypeScript
  • 依然使用Lua解释器,但是使用一门强类型语言编程,并翻译至Lua

ILRuntime解释器

按一般的思路来看,用ILRuntime是比较正统的解决方案,如果由Unity官方来推动代码热更的话恐怕就是这个,毕竟没有哪个语言在提供代码热更的方案的时候,会主动换成另外一个脚本语言(点击此处了解

而且相比其他更冷门的解决方案,ILRuntime还是有一些实际产品的。

优点应该无需臃述,现在单说缺点:

借用这位老兄的测试结果Unity中SLua、Tolua、XLua和ILRuntime效率评测 - CSDN博客

在可使用JIT的安卓环境下,ILRuntime其实比lua拥有更好的性能。但是在不能使用JIT的IOS环境下,虽然在普通的API调用方面和lua差距不大,但是在纯粹的简单数值计算,循环,数组存取上,确实和lua有着非常大的差距(下图的最后两个Test)

<ignore_js_op>
image

虽然这个测试结果看上去很严重,但毕竟Test9是这样的测试代码

image

用来作为慢18倍的依据恐怕并不合适。

而在Test8里

image

只是循环内多了几个简单计算,两者之间的差距就缩小了很多(仅3倍)。

由于ILRuntime在调用C#API时效率比Lua更高(无需类型转换),综合判断,在实际的项目里很可能差距也就2,3倍,这并非不能接受的。在安卓JIT下更是可以和Lua拉平。

因为和外部的非热更代码使用的是同一语言,穿透调用性能较高,将性能敏感的代码移动到非热更区域会比Lua更加容易,细心处理搞不好性能还会更高。

如果实在担心ILRuntime的性能问题。其实可以去查一下python和lua的性能对比——ILRuntime还真不一定比“一切皆对象”的python慢。

而网易的手游基本都是python,这个信息对说服老板使用此方案应该会有比较大的帮助。

此外,还有位老兄仿造xlua写了一个基于ILRuntime的HotFix方案(点击此处查看

这样给予了这个方案更大的使用灵活性,可以选择新版本使用最高效的il2cpp代码,而旧版本通过热更部分使用效率较低的ILRuntime代码。这样虽然ILRuntime部分比lua慢,但是占比更大的il2cpp部分则比lua快,整体上反而比lua方案效率增加了。

而且不同与xLua,HotFix和正常更新并存的方案并不需要两套代码,实现成本其实不高。

(但要注意这库是个新库,虽然ILRuntime本身是经过验证的方案,但他新加这套东西不好说有没有问题,想用C# HotFix就要承担这个风险。)

TypeScript

有人用,但我不了解,跳过吧。

由强类型语言翻译至Lua

最理想的做法,是直接将C#翻译成Lua。(点击此处查看

但据使用过的人评价,这个库效果并不稳妥。没用过,所以此言论仅供参考。

这里要说的是另一个转换方案(点击此处查看

HaXe这个语言应该大部分人都没听说过,它本身就是一个“翻译成其他语言”以实现跨平台的语言,所以没有厂商背书也没有社区影响,因为这个理由一直很冷。

但是在现在这个状况下,还真没有比这个更好的选择了。

首先HaXe生成lua在coscos时代还真有项目这么用,它在生成lua代码这方面的能力起码被证实了。语言本身是ECMA系的,没有学习难度,大概是个TS+AS的混合体,包括类型推断等现代语言特性,至少是不比C#差的。唯一缺少的是方法重载,但是有不定向的参数默认值作为代替。

除此之外还有一些奇怪的语法糖特性,但是可以不用了解。

虽然需要学习新语言,但毕竟它没有自己的标准库,长得也和现有的语言差不多,其实是没啥学习难度的。

事实上也没有使用风险,因为它其实就是一个广义的lua编辑器,最后输出到Unity工程目录的只有一个lua文件,可以搭配其他lua方案使用。

此外,它也支持输出成C#源文件,也可以方便的把性能敏感代码转移到非热更部分。(点击此处查看

不过Haxe直接用到Unity上还需要稍微做些工作。因为HaXe是强类型语言,你必须生成一组桥文件才能让它调用Unity的API,和Lua需要生成的C#类桥文件差不多。这个库给了生成的工具。

另外带了几个lua文件桥接了lua的一些功能(比如说协程)

HaXe的桥文件,实质就是指示翻译器在翻译成目标语言的途中让某些代码保持原样,顺带实现代码提示。学会这个用法后,就可以方便地写出自己的扩展,不用担心和其他语言的通信难度问题。https://haxe.org/manual/lf-externs.html

这个库也是前天才创建的新库,但实际上主要是个示例工程,因为HaXe其实本来就可以直接用在Unity+???Lua上的。

现在也基本能用了,至少在我看来,HaXe这个方案是目前成本最低的,最安全的“干掉天杀的Lua”的办法。

知乎@flashyiyi

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容