苦等4年,《黑神话:悟空》终于在周二正式上线了。朋友们开始玩了吗?不会还有人像我一样是被抛弃的 Xbox 玩家吧?不会吧?言归正传,今天我们抛开游戏不谈,来聊一聊游戏开发领域的技术话题。 近年来,随着游戏行业的发展和国产游戏的崛起,越来越多的作品选择使用 Unreal 进行开发,《黑神话:悟空》这一旷世大作便是基于 Unreal 引擎开发,更多我们熟知的游戏如《原神》、《王者荣耀》则是基于 Unity 开发。 鲁迅曾经说过:一个成功游戏引擎的背后,离不开一个默默支持他的热更脚本,不论你使用 Unreal 还是 Unity,不论你写 C 还是 C#,开发一款大型游戏,总是离不开热更新技术的支持,也离不开背后默默支持你热更的 Lua。 本文作者及其团队以 Lua 与游戏行业热更新技术史为基础,创作了这样一篇女朋友也能看懂的科普向技术好文,看完以后记得分享给你的女朋友哦!(你是怎么知道我女朋友给我买了典藏版的?)
01、免责(shuai guo)声明
本文为标题党,作者不支持读者的任何抽象行为,阅读本文产生的任何后果,作者概不负责。
02、前言
说到游戏和 VR 技术,不得不提到如今游戏行业的当红炸子鸡双 U(Unity 3D 以及 Unreal Engine),目前的游戏开发领域,基本处于 Unity 和 Unreal (UE4、UE5)双雄争霸的格局。随着业务的发展,我们终端团队也需要在游戏开发的方向进行一定的技术储备,针对 Android VR 设备进行热更新能力预研,于是,这篇技术预研与分享便应运而生了。
然而鲁迅曾经说过:爱一个人是藏不住的,但是爱两个一定要藏住。游戏引擎也是如此。相比于 Unreal,Unity 容易上手、开发者众多、强大的生态和 Asset Store 则是让其成为国内众多 VR 厂商的首选,Unity 优秀的 3D 渲染能力能为我们提供更有科技感的动画与交互,IL2CPP 脚本后端出色的性能也可以为业务生态赋能,于是我们选择先爱 Unity。
在方案实施的过程中也涌现出了若干问题,其中一个比较棘手的是在我们的业务需要将 Unity SDK 提供给开发者,但 SDK 接入的模式就导致了我们的 SDK 升级不能依赖开发者手动升级版本出包发版,热更新将作为我们后续的主要升级手段。如何能在 Android 平台进行多、快、好、省的 Unity SDK 热更新呢?这就是我们今天要讨论的问题。
本文首先向您简单介绍游戏行业热更新技术的发展历史,然后是我们的热更新的架构设计,以及方案的穿刺验证。我们希望能给您讲一个故事,而不是一个严肃的技术分享,希望能让您在忙碌一天后得到些许放松的同时也能了解到不同技术领域的发展。
当然,笔者只是游戏客户端开发新手,如果您是游戏开发大佬,这篇文章可能在您看来只是班门弄斧,如有谬误还望您不吝赐教;如果您不是技术同学,只是一位游戏发烧友,也请不要急着滑走,相信也能从这里读到游戏行业的发展历程,了解游戏热更新技术的演进历史和演进方向。
03、游戏行业热更新技术史
3.1 缘起魔兽
时间回到二十年前,千禧年左右的端游时代,推开一间网吧大门,香烟和泡面气息扑面而来,密密麻麻摆放的电脑座无虚席,有人喊打喊杀、有人嬉笑叫骂,劣质座椅上每一个人,都如同打了鸡血一般,那时有很多 90 后,就在这样一间小小的网吧,在《魔兽世界》中挥洒着青春。
这也是游戏工业的蛮荒时代,彼时游戏引擎的概念还只是一个模糊的雏形,如今的双星巨人 Unity 和 UE 在那时只是嗷嗷待哺的婴儿,而《魔兽世界》,则是第一个将 Lua 成熟应用到大型游戏的产品,当时的《魔兽》对 Lua 的使用还算是保守的,基本只是应用在客户端 UI 脚本、客户端插件方面,Lua 代码的比例不算高。
3.2 巴西取经
而到了网吧的另一端,另一部分 90 后玩家则爱上了网易公司开发的回合制游戏:《梦幻西游》和《大话西游》。他们的取经团队得益于交通技术的突飞猛进和一带一路的布局建设,在取经路上开上了“公路之王”白龙马X5,但是开车的时候没用腾讯地图打导航,导致迷了路越过天竺一路向西,一直到了巴西才刹住车,给国内开发者取回了“Lua 圣经”(注:Lua 诞生于巴西里约热内卢天主教大学)。他们不仅在客户端充斥着数不胜数的 Lua 脚本,甚至服务端逻辑都大量采用 Lua 编写,虽然现在看起来是有些不太靠谱,但在当年还用 Dephi 这种古早语言写网游(如《是兄弟就来砍我》)的时代,这其实是非常先进的,甚至是超前的。
3.3 初识 Lua
《梦幻西游》和《大话西游》对于 Lua 炉火纯青的应用,也将 Lua 在业界的应用推向了高潮。“Lua 圣经”一时间被游戏开发者们奉为圭皋,那以后的游戏开发 er 从此走上了 Lua 热更新的路一去不复返,Lua 的风光一时无两。开发者不断建设 Lua 生态,新的游戏又路径依赖或是看中生态选择 Lua,形成一个良性循环,也使得 Lua 的地位不断巩固达到高峰,不论引擎从 cocos 演进到双 U,平台也从端游切换到手游,时至今日,Lua 也仍是一棵常青树,仍是游戏行业动态化与热更新领域绕不过去的话题。
当然,Lua 的火热并不仅仅是几款游戏的功劳,我们今天只是用这几个爆款游戏的故事串起时间线引出 Lua 的崛起史。简单来说,在当时的历史局限性下,Lua 学习的便捷性、Lua 与 C 语言无障碍通信(古早时代机器性能受限,C 系语言大行其道)、抑或是团队技术栈、历史包袱和路径依赖等等,个中原因也让其成为游戏开发者们不二的的选择。一个人有其命运,一个语言亦如是,Lua 便是这些年游戏热更新领域的那个被幸运女神眷顾,被时代洪流推到台前的那颗明星。
既然如此成熟且可靠,那么 Lua 热更新方案 自然便成为我们第一个考虑的热更新方案,同时 Lua 拥有司内的 xLua 和司外的 sLua 等成熟库的支持,成熟的开源社区和丰富的踩坑经验自然带给我们更大的底气,Lua 热更新方案也是我们着重考虑的一大方向。
3.4 质疑 Lua
然而,随着游戏行业的发展,游戏工业进步迅速,新技术层出不穷,编程语言也在数年间进行了现代化的进化、迭代与改革,大家逐渐发现 Lua 一些让人难以接受的缺点,Lua 也从“小甜甜“变成了”牛夫人“。比如游戏行业大佬、网易登山工作室前技术总监、KCP 作者韦易笑曾细数过 lua 十宗罪:
- 作用域默认是 global 的,不是 local 的,但凡最近三十年发明的语言,变量和函数定义基本都是默认 local 的作用域 ,lua 这种默认 global 的设计,强迫你到处写满 local,简直是一口气直追 50 年前的古圣先贤