写在前面
\\xLua是Unity3D下Lua编程解决方案,自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。现在,腾讯已经将xLua开源到GitHub。
\\2016年12月末,xLua刚刚实现新的突破:全平台支持用Lua修复C#代码bug。
\\目前Unity下的Lua热更新方案大多都是要求要热更新的部分一开始就要用Lua语言实现,不足之处在于:
\\- 接入成本高,有的项目已经用C#写完了,这时要接入需要把需要热更的地方用Lua重新实现;\\t
- 即使一开始就接入了,也存在同时用两种语言开发难度较大的问题;\\t
- Lua性能不如C#;\
xLua热补丁技术支持在运行时把一个C#实现(函数,操作符,属性,事件,或者整个类)替换成Lua实现,意味着你可以:
\\- 平时用C#开发;\\t
- 运行也是C#,性能秒杀Lua;\\t
- 有bug的地方下发个Lua脚本fix了,下次整体更新时可以把Lua的实现换回正确的C#实现,更新时甚至可以做到不重启游戏;\
这个新特性iOS,Android,Window,Mac都测试通过了,目前在做一些易用性优化。
\\那么,腾讯开源的xLua究竟是怎样的技术?它是为何如此设计的?更令人关心的是,xLua的性能如何?带着这些问题,InfoQ对其作者进行了采访并将内容整理成文。
\\嘉宾简介
\\车雄生,05年毕业,在华为工作了6年,跟着先后在两游戏创业公司待了几年,15年进入腾讯互娱公共组件中心。目前专注于一些游戏公共组件的开发。
\\技术背景
\\腾讯自研手游,就我了解的项目来说,大多数游戏引擎都是Unity3D,少数用coco2d。
\\xLua这个插件具体用到了哪些游戏中?虽说xLua是2015年3月就完成了第一个版本,但由于当时项目组热更的意识并没有很普遍,需求不是很强烈,xLua的开发资源都调到更紧急的项目了。直到15年年底正式集成到我们的apollo手游开发框架,才迎来xLua的第一个项目。到目前为止,我们已知的应用了xLua的项目有十多个,其中不乏一些重量级IP,或者按星级标准打造的产品。
\\在xLua之前,面对iOS无法热更新的问题,有用ulua的,有用slua的,也有项目用自研的脚本语言,不过当时用人更新的项目也不多。
\\热更新流程
\\手游的热更新流程很简单,只是启动时检测下是否有新版本文件,有的话就下载覆盖老文件,然后启动。
\\下载的文件如果是图片,模型这些是没问题的,但如果是Unity原生的代码逻辑,无论是以前的Mono AOT或者后来的il2cpp,都是编译成native code,iOS下是跑不了的。
\\解决办法就一个,别用native code,别用jit,解析执行就可以了。包括xLua在内的所有热更新支持方案都是通过“解析执行”来实现代码逻辑热更新。
\\来自xLua的 Hello world
\\(1)三行代码跑lua脚本
\\一个完整的例子仅需3行代码:
\\下载xLua后解压到Unity工程Assets目录下,建一个MonoBehaviour拖到场景,在Start里头加上这么三行:
\\\XLua.LuaEnv luaenv = new XLua.LuaEnv();\luaenv.DoString(\"CS.UnityEngine.Debug.Log('hello world')\");\luaenv.Dispose();\\\
运行就可以看到Console打印的hello world。
\\- 第一和第三行分别LuaEnv的创建以及销毁,所谓LuaEnv可以理解为lua虚拟机,往往整个工程一个虚拟机即可:\\t
- DoString里头可以是任意合法的lua代码,例子中调用了UnityEngine.Debug.Log接口打印了一个log(C#的静态函数在