杂谈游戏代码热更新的重要性

2016年08月25日 15:22 0 点赞 0 评论 更新于 2025-11-21 20:19
杂谈游戏代码热更新的重要性

热更新的内容可以涵盖美术资源和代码。相对而言,美术资源的更新限制较少,而代码更新则面临诸多挑战,本文将重点探讨代码热更新。

热更新:开发者眼中的“麻烦事”与游戏运营的关键需求

对于开发者,尤其是注重效率、便捷性和代码结构的程序员来说,热更新可能被视为运营人员缺乏技术理解的体现。然而,对于上线只是起点的网络游戏,特别是手游而言,热更新是极为重要的基础功能。

为何需要热更新

客户端层面

1. 适应上线需求

手游客户端受苹果审核机制约束,一次审核提交需等待 10 - 20 天不等。在此期间,游戏开发进度仍在推进。手游上线后,首个版本在玩家大量涌入的情况下出现问题在所难免,“上线即更新”成为常态。若只能进行大包更新而无法热更新,10 - 20 多天后,游戏可能已无人问津。此外,渠道和发行投入大量资金推广后,玩家迎来满是 bug 的版本,这不仅影响玩家体验,也反映出开发者的态度问题。

2. 热调试、热开发与热发布

由于 Unity3D 为适应 64 位应用需求,将 C# 编译出的 IL 代码通过 il2cpp 第三方库编译为 C++,虽提升了效率,但工程编译和发布时间大幅增加,通常需要 1 - 2 小时。即便配备 SSD,为修改一个 bug 也需长时间等待。在核心功能不变的情况下,热更新可成为开发期间的有效工具。修改 Lua 代码后,可立即在手机上查看效果,无需编译和发布,反而提高了开发效率。

服务器层面

常见游戏类型的玩家半夜在线人数通常会急剧下降,但热门的 MMO 及以沟通为基础的游戏,半夜仍有大量玩家在线。传统的停服更新会严重影响玩家热情,例如《守望先锋》公测停服 15 天给玩家带来的糟糕体验。因此,为保障玩家体验并确保服务器稳定,使用热更新修复轻微 bug 是最佳选择。服务器程序员不能仅以服务器稳定为由忽视玩家体验,技术的目的是解决问题,而非炫耀。

如何实现热更新

以下是 Unity3D 的几种热更新方式:

基于 C#,使用动态加载 Assembly 反射更新代码

这种方式在安卓平台完全可行,无需对现有架构进行大幅修改,仍可使用 C# 和 Unity3D 进行开发。但在 iOS 平台受限,因此对于全平台首发或双平台上线的游戏,这种方式逐渐被弃用。

基于 Lua,将 Lua 代码视为资源,动态加载并运行

云风团队早期开发的 UniLua 是基于 C# 编写的 Lua 虚拟机,仅支持字节码解释,无法实现动态功能,效率极低。后期出现的 ulua 改变了这一局面,它基于 Tolua 库进行封装,添加了便捷封装、代码打包和基本框架。

ToLua 是基于 C 版 Lua 扩充的库,以静态链接库方式与 Unity3D 代码链接,运行在 C 层,速度与 C++ 和 Lua 的组合相当。基于 Lua 的代码更新方式可跨平台使用同一套代码和工作流,避免了诸多问题,成为当前主流的开发方式。

游戏逻辑是否全用 Lua 编写

有网页和手机 App 开发经验的开发者会发现,JavaScript 这种存在较多 bug、设计独特的语言成为主流界面开发语言。这是因为其动态特性适合 UI 开发。相反,使用 C++ 开发界面,如 Qt、MFC 等,虽设计严谨,但难以满足各种奇葩的修改需求。

因此,推荐使用动态语言(如 Lua)开发游戏界面,而游戏核心逻辑则根据游戏类型而定。对于效率瓶颈点(如 Update 函数),尽量使用 C# 或 C++ 实现。

结语

当前中国游戏市场的玩家需求和各种氪金机制与纯粹的游戏理念存在冲突。但国外游戏在更新机制等方面存在的问题,如暴雪战网更新不及时、版本不对无提示等,在中国网游中很少出现。尽管在技术上我们可能无法超越欧美,但在玩家体验方面,我们输出了自己的价值观,值得国外同行学习。对于程序员而言,应更贴近玩家,了解行业动态。