http://www.manew.com/thread-114496-1-1.html
 
谈到目前的代码热更方案:没什么特别的要求
 
<ignore_js_op> 
 
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还是有一些实际产品的。
优点应该无需臃述,现在单说缺点:
在可使用JIT的安卓环境下,ILRuntime其实比lua拥有更好的性能。但是在不能使用JIT的IOS环境下,虽然在普通的API调用方面和lua差距不大,但是在纯粹的简单数值计算,循环,数组存取上,确实和lua有着非常大的差距(下图的最后两个Test)
<ignore_js_op> 
虽然这个测试结果看上去很严重,但毕竟Test9是这样的测试代码
<ignore_js_op> 
用来作为慢18倍的依据恐怕并不合适。
 
而在Test8里
 
<ignore_js_op> 
只是循环内多了几个简单计算,两者之间的差距就缩小了很多(仅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

Unity热更方案汇总的更多相关文章

  1. unity 热更方案对比

    现在一般使用的方案有:tulua&ulua.xlua.ILRuntime 对比: tulua&ulua 方案成熟,稳定第三方库支持 xlua 之前是为了热更修复线上bug的,腾讯发起的 ...

  2. unity热更新方案对比

    Unity应用的iOS热更新 •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对Unity 应用进行热更新 •  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...

  3. unity 热更新方案ILRuntime

    https://github.com/meta-42/ILRuntime 教程 https://ourpalm.github.io/ILRuntime/public/v1/guide/index.ht ...

  4. lua热更框架之XLua

    框架介绍 xLua是当下最流行的unity热更方案之一,作者是腾讯的车雄生前辈,自2016年初推出以来,已经在腾讯的多款游戏项目上应用,目前xLua已经开源到了GitHub.xLua最大的特色是不仅支 ...

  5. Unity3D 热更新方案总结

    如何评价腾讯在Unity下的xLua(开源)热更方案? Unity 游戏用XLua的HotFix实现热更原理揭秘 腾讯开源手游热更新方案,Unity3D下的Lua编程 [Unity]基于IL代码注入的 ...

  6. Unity热更新对比

    https://www.jianshu.com/p/f9d90edf4a7c Unity 热更新为啥用Lua 详解 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime主要有以下优 ...

  7. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  8. Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建

    前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...

  9. React Native拆包及热更新方案 · Solartisan

    作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...

随机推荐

  1. Python之模块一

    1 >模块介绍: 模块,用一坨代码实现了某个功能的代码集合,类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的          重用性和代码间的吻合, ...

  2. delphi edit边框成为下划线

    设置它的几个属性:BevelEdges    |_ beLeft = False;    |_ beTop   = False;    |_ beRight = False;    |_ beBott ...

  3. ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)

    ASP.NET Mvc是ASP.NET的一个框架,同样也是基于管道的设计结构.HttpModule和HttpHandler是ASP.NET的两个重要组件,同样的在Mvc中也是非常重要的组件.在应用程序 ...

  4. Redis协议规范(译文)

    Redis客户端使用名为RESP(Redis序列化协议)的协议与Redis服务器进行通信. 虽然该协议是专为Redis设计的,但它可以用于其他CS软件项目的通讯协议. RESP是以下几方面的考虑: 易 ...

  5. 【05】循序渐进学 docker:系统资源和网络

    写在前面的话 在上一篇学习 Dockerfile 的时候其实还有几个相当重要得关键中没有谈到,但没关系,在后面的内容会单独提出来一个一个的学习.这里就先谈谈关于资源的控制个容器的网络~ 资源限制 其实 ...

  6. 《Think in Java》20 21(并发)

    chapter 20 注解 三种标准注解和四种元注解: 编写注解处理器 chapter 21 并发 基本的线程机制 定义任务 package cn.test; public class LiftOff ...

  7. BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

    题目描述 Bob有一棵 nn 个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob ...

  8. Python3.6引入的f-string 与 Python 3的新的特性:类型注解;

    f-string 1.介绍 f-string(formatted string literals):格式化字符串常量,是Python3.6新引入的一种字符串格式化方法,使格式化字符串的操作更加简便. ...

  9. 微信小程序之tabbar切卡

    最近在研究小程序的时候,遇到了一个问题,就是tabbar切卡,在android上有fragment,在RN上也有提供一个第三方的组件来用,微信小程序,好像没有专门的一个组件来实现这个功能,度娘了大半天 ...

  10. XML标签属性

    0. 内容索引 1. XML序列化与反序列化 2. 相关的常用Attribute 3. 相关的全部Attribute 4. XML序列化答疑 5. 高级议题 1. XML序列化与反序列化 // OBJ ...