游戏开发中的热更新:一

什么是热更新?

在软件开发过程中不需要重新安装整个软件,而是通过下载和安装补丁或文件来更新部分功能或内容。

在游戏开发中,热更新通常指的是通过网络下载和更新游戏资源,配置文件和脚本等内容,以更新游戏的功能逻辑,而不需要重新发布游戏客户端。

为什么要热更新?

快速修复错误和漏洞;降低测试和发布的成本;节约用户流量;提高游戏体验;

游戏开发中如何做热更新?

在游戏开发中,热更新通常分为资源热更新和代码热更新两种方式:

1.资源热更新:(图片,音频,配置文件等资源文件和相关数据文件)

(1)将需要更新的资源文件上传至服务器。

(2)游戏客户端通过网络连接,从服务器上下载需要更新的资源文件。

(3)游戏客户端将下载的资源文件保存到本地,并替换原有的资源文件

2.代码热更新:(逻辑代码,脚本代码和相关游戏数据)

(1)在游戏中使用脚本语言(例如 Lua)编写需要更新的代码逻辑

(2)将需要更新的代码逻辑上传至服务器。

(3)游戏客户端通过网络连接,从服务器上下载需要更新的代码逻辑。

(4)游戏客户端将下载的代码逻辑保存到本地,并替换原有的代码逻辑。

热更新还需要考虑版本号的管理和网络传输的安全性,以保证正确和稳定性。

资源热更新使用的技术?

使用AssetBundle:AssetBundle 是 Unity 引擎提供的一种动态加载和卸载资源的技术。通过将游戏中需要动态加载的资源打包成一个或多个 AssetBundle 包,然后在游戏运行时从远程服务器或本地文件系统加载这些资源,实现游戏资源的热更新。

什么是增量打包?

增量打包是指在游戏发布后,对已有的资源进行修改、添加、删除等操作,只重新打包被修改的资源,而不需要重新打包所有资源的一种打包方式,可以大大减小游戏更新的体积和下载时间。

代码热更新的几种方式?

  1. Lua热更新:使用Lua脚本语言编写游戏逻辑代码,通过读取Lua脚本文件实现热更新。优点是轻量级、简单易用,缺点是性能相对较低。

  2. C#热更新:通过反射机制实现C#代码的热更新,将新的C#代码编译为DLL或Assembly,运行时动态加载和卸载DLL或Assembly。优点是性能较高,缺点是实现较为复杂。

  3. Unity的IL2CPP热更新:将C#代码编译为C++代码,使用Unity自带的IL2CPP工具将C++代码编译为目标平台的可执行文件,运行时通过读取资源包实现热更新。优点是性能较高,缺点是实现较为复杂。

  4. 动态脚本热更新技术:通过自定义脚本解释器实现动态解析和执行脚本代码,从而实现热新。优点是灵活、可扩展,缺点是性能相对较低。


(大部分游戏/我接触过的游戏都是使用lua进行热更新的)

在游戏开发中为什么选择使用lua?

lua属于轻量级的解释性语言,解释性语言不需要像编译性语言一样进行编译和链接操作,只要有对应的lua解释器进行行为翻译就可以很方便的调用底层代码。轻量级代表其脚本文件比较小,不需要占用太多的带宽和存储空间。

lua的解释器是一个高效的虚拟机,有快速执行和低内存占用的特点。(与其他自定义的解释器相比较会有高效性能,但是和底层的C/C++的性能还是没得比)

lua解释器可以在各种操作平台上运行,所以这一部分逻辑可以在不同平台上共享和重用。

lua支持与C语言的互操作,使得lua脚本可以调用C函数,C代码调用Lua脚本中的函数,易于嵌入到其他程序中,尤其是C/C++/C#支持的游戏引擎;

lua具有高度的灵活性和扩展性,可以方便的修改和调试逻辑,同时不会影响到游戏底层的逻辑和稳定性。

lua语言有庞大的社区支持,提供许多有用的库和工具。

为什么不使用其他的更新技术?(自己的理解,不全面,随时补充修稿)

更新底包意味着重新下载整个游戏客户端,所以一般是不希望更新底包的。

游戏包  = 底包+ab包(资源包)

                底包 = .exe文件 + .dll文件 + lua解释器 + 一些额外资源(如登陆界面)+ ...

                ab包  = Asset资源 + 表格配置+lua代码 + ...

热更新需要是在游戏开启的状态,所以.exe文件无法热更;

一般.dll文件在解除所有引用后可以进行热更,解除引用的这个步骤实现就比较复杂。

而且在手机软件的开发中,出于一些平台开发商需求以及提审的考量(审查收费,获取用户隐私等),没有什么大问题的情况下不会选择更新底包,因为这样做不安全并且非常低效。

所以使用只更新ab包的资源以及lua代码来实现热更新。

Guess you like

Origin blog.csdn.net/weixin_40695640/article/details/129463767