CN112162767A - 一种热更新方法、装置、设备及存储介质 - Google Patents
一种热更新方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN112162767A CN112162767A CN202011011341.0A CN202011011341A CN112162767A CN 112162767 A CN112162767 A CN 112162767A CN 202011011341 A CN202011011341 A CN 202011011341A CN 112162767 A CN112162767 A CN 112162767A
- Authority
- CN
- China
- Prior art keywords
- data object
- function prototype
- function
- prototype
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 49
- 230000006870 function Effects 0.000 claims abstract description 308
- 230000004044 response Effects 0.000 claims abstract description 17
- 238000012545 processing Methods 0.000 abstract description 11
- 238000010586 diagram Methods 0.000 description 14
- 238000004590 computer program Methods 0.000 description 11
- 238000004891 communication Methods 0.000 description 10
- 230000008569 process Effects 0.000 description 10
- 238000005516 engineering process Methods 0.000 description 8
- 238000011161 development Methods 0.000 description 4
- 230000000977 initiatory effect Effects 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000008439 repair process Effects 0.000 description 3
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000010295 mobile communication Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- A—HUMAN NECESSITIES
- A63—SPORTS; GAMES; AMUSEMENTS
- A63F—CARD, BOARD, OR ROULETTE GAMES; INDOOR GAMES USING SMALL MOVING PLAYING BODIES; VIDEO GAMES; GAMES NOT OTHERWISE PROVIDED FOR
- A63F13/00—Video games, i.e. games using an electronically generated display having two or more dimensions
- A63F13/60—Generating or modifying game content before or while executing the game program, e.g. authoring tools specially adapted for game development or game-integrated level editor
- A63F13/69—Generating or modifying game content before or while executing the game program, e.g. authoring tools specially adapted for game development or game-integrated level editor by enabling or updating specific game elements, e.g. unlocking hidden features, items, levels or versions
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请实施例提供一种热更新方法、装置、设备及存储介质。在本申请实施例中,可响应于热更新指令,确定待更新的第一数据对象;创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。据此,本申请实施例中,可通过替换第一数据对象对应的函数原型的方式来更新第一数据对象的逻辑,这样,对于已经加载到内存或者注册到其它语言层的数据对象,也能够实现热更新,而不再需要针对每一处数据对象进行单独处理,因此,可有效降低热更新的复杂度,提高热更新的性能。
Description
技术领域
本申请涉及数据处理技术领域,尤其涉及一种热更新方法、装置、设备及存储介质。
背景技术
在游戏领域中,BUG的修复和小功能的添加等工作是比较高频的,从成本和速度的角度考虑,采用热更新的方式更为划算。
目前,通常是基于lua package的方法进行热更新,在清除lua的package缓存后再重新require,即可达到重新加载lua逻辑。使用类似以下函数实现代码的热加载:
但是,这种方法,无法替换已经加载到内存或者注册到其它语言层的函数,只能通过显式的针对每一处函数增加Reload方法来更新逻辑。这导致热更新过程的复杂度较高,游戏维护成本增加。
发明内容
本申请的多个方面提供一种热更新方法、装置、设备及存储介质,用以降低热更新的复杂度。
本申请实施例提供一种热更新方法,包括:
响应于热更新指令,确定待更新的第一数据对象;
创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;
将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。
本申请实施例还提供一种热更新装置,包括:
确定模块,设置为响应于热更新指令,确定待更新的第一数据对象;
加载模块,设置为创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;
替换模块,设置为将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。
本申请实施例还提供一种计算设备,包括存储器和处理器;
所述存储器用于存储一条或多条计算机指令;
所述处理器与所述存储器耦合,用于执行所述一条或多条计算机指令,以用于:
响应于热更新指令,确定待更新的第一数据对象;
创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;
将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。
本申请实施例还提供一种存储计算机指令的计算机可读存储介质,当所述计算机指令被一个或多个处理器执行时,致使所述一个或多个处理器执行前述的热更新方法。
在本申请实施例中,可响应于热更新指令,确定待更新的第一数据对象;创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。据此,本申请实施例中,可通过替换第一数据对象对应的函数原型的方式来更新第一数据对象的逻辑,这样,对于已经加载到内存或者注册到其它语言层的数据对象,也能够实现热更新,而不再需要针对每一处数据对象进行单独处理,因此,可有效降低热更新的复杂度,提高热更新的性能。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请一实施例提供的一种热更新方法的流程示意图;
图2为本申请一示例性实施例提供的一种热更新方案的逻辑示意图
图3为本申请一示例性实施例提供的一种热更新装置的结构示意图;
图4为本申请一示例性实施例提供的一种计算设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
针对现有的热更新方案存在的更新复杂度高、性能低等技术问题,本申请实施例的一些实施例中:可响应于热更新指令,确定待更新的第一数据对象;创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。据此,本申请实施例中,可通过替换第一数据对象对应的函数原型的方式来更新第一数据对象的逻辑,这样,对于已经加载到内存或者注册到其它语言层的数据对象,也能够实现热更新,而不再需要针对每一处数据对象进行单独处理,因此,可有效降低热更新的复杂度,提高热更新的性能。
以下结合附图,详细说明本申请各实施例提供的技术方案。
图1为本申请一实施例提供的一种热更新方法的流程示意图。图2为本申请一示例性实施例提供的一种热更新方案的逻辑示意图。参考图1和图2,该热更新方法包括:
步骤100、响应于热更新指令,确定待更新的第一数据对象;
步骤102、创建符合更新需求的第二数据对象,以获得第二数据对象对应的目标函数原型;
步骤103、将第一数据对象的函数原型替换为目标函数原型,以对第一数据对象进行热更新。
本实施例提供的热更新方法可应用于各种需要进行热更新的场景中,例如,对游戏程序或其它应用程序进行热更新的场景等。本实施例对应用场景不做限定。
其中,在不同的应用场景中,采用的程序语言可能不完全相同。而在不同的程序语言下,数据对象的实现形式可以是多种多样的。例如,在lua语言下,数据对象可以是lua函数。
以游戏场景为例,BUG的修复和新功能的添加工作是很高频率的,因此,采用热更新的方式是比较划算的,否则,游戏运营商就要同时管理同一个游戏的不同版本的程序文件,非常繁琐。其中,热更新是指动态下发代码,热更新可以使开发者在不发布新版本的情况下,修复BUG和发布功能。
为此,本实施例中,用户可在需要进行热更新的情况下,发起热更新指令。这里的用户可以是开发者等。另外,本实施例中,不限定热更新指令的发起形式。
基于此,在步骤100中,可响应于热更新指令,确定待更新的第一数据对象。例如,在lua语言下,用户想要更新UI:OnButtonClick函数,则可将UI:OnButtonClick函数作为第一数据对象。
根据更新需求,用户可创建第二数据对象。例如,在lua语言下,可通过执行一个形如function...end这样的表达式,来创建个新的数据对象。实际应用中,在Lua中编译一个函数时,会为该lua函数生成一个函数原型(prototype),函数原型中包含了函数体对应的虚拟机指令、函数用到的常量值(数,文本字符串等等)和一些调试信息等,函数原型可用于表征lua函数的函数逻辑。
在步骤102中,可创建符合更新需求的第二数据对象,以获得第二数据对象对应的目标函数原型。其中,目标函数原型所表征的函数逻辑,即为用户期望更新至第一数据对象中的函数逻辑。
在此基础上,步骤103中,可将第一数据对象的函数原型替换为目标函数原型,以对第一数据对象进行热更新。
通过将第一数据对象的函数原型替换为目标函数原型,可将第一数据对象的函数逻辑替换为第二数据对象的函数逻辑,从而实现对第一数据对象的更新。而在后续的数据对象引用阶段,由于通常是以数据对象为整体作为引用基础,因此,无论第一数据对象是否已经加载到内存,还是已经注册到其它语言层,只要引用到第一数据对象,都会按照更新后的函数逻辑进行执行,从而可实现对第一数据对象的热更新。
据此,本实施例中,可响应于热更新指令,确定待更新的第一数据对象;创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。据此,本申请实施例中,可通过替换第一数据对象对应的函数原型的方式来更新第一数据对象的逻辑,这样,对于已经加载到内存或者注册到其它语言层的数据对象,也能够实现热更新,而不再需要针对每一处数据对象进行单独处理,因此,可有效降低热更新的复杂度,提高热更新的性能。
在上述或下述实施例中,可在第一数据对象和第二数据对象之间交换函数原型,以实现将第一数据对象的函数原型替换为目标函数原型。
在一种可选的实现方式中,可将第一数据对象的函数原型指针配置为指向目标函数原型,其中,第一数据对象中包含函数原型指针。
例如,在lua语言下,一个lua函数在虚拟机中通常是一个lua闭包(closure)。在数据结构上,lua闭包包含垃圾回收头、函数原型指针和upvalue表等。在Lua函数对应的lua闭包中,可将函数原型指针配置为指向lua函数的原始函数原型,以支持对lua函数的引用。
在该实现方式中,可将第二数据对象包含的函数原型指针的数据赋值给第一数据对象包含的函数原型指针,其中,第二数据对象包含的函数原型指针指向目标函数原型,以将第一数据对象的函数原型指针配置为指向目标函数原型。
另外,在该实现方式中,可将第一数据对象包含的函数原型指针赋值给一中间变量,之后,在将第二数据对象包含的函数原型指针赋值给第一数据对象包含的函数原型指针,最后,再将中间变量的当前值赋值给第二数据对象包含的函数原型指针,从而实现第一数据对象和第二数据对象之间函数原型指针的交换。当然,还可直接将第二数据对象包含的函数原型指针赋值给第一数据对象包含的函数原型指针,这种情况下,第一数据对象包含的原始的函数原型指针将被丢弃,但这不影响本实施例中热更新方案的实施。本实施例对此不做限定。
据此,在该实现方式中,可通过修改第一数据对象包含的函数原型指针,来重新指定第一数据对象对应的函数原型,从而达到对第一数据对象进行热更新的目标。
在另一种实现方式中,可:
创建临时变量;
将第一数据对象对应的函数原型的数据赋值给临时变量;
将目标函数原型的数据赋值给第一数据对象对应的函数原型;
将临时变量的数据赋值给目标函数原型,以交换第一数据对象对应的函数原型和目标函数原型的数据。
在该实现方式中,可通过一临时变量,实现第一数据对象和第二数据对象之间函数原型的交换。
据此,在该实现方式中,无需对第一数据对象中的函数原型指针进行修改,而是直接对第一数据对象对应的函数原型进行修改。该实现方式,同样可重新指定第一数据对象对应的函数原型,从而达到对第一数据对象进行热更新的目标。
当然,本实施例中,还可采用其它实现方式实现在第一数据对象和第二数据对象之间交换函数原型,本实施例并不限于此。
另外,本实施例中,如前文提及的,第一数据对象中除了包含函数原型指针外,还可包含upvalue表等其它数据,本实施例中,可在热更新过程中,保持第一数据对象中包含的函数原型指针之外的数据不变。例如,在lua语音下,可保持第一数据对象中的upvalue表不变。由于程序运行环境中的一些状态值存储在upvalue表中,因此,保持upvalue表不变,可保证程序运行环境不被破坏,也就不需要开发者为保留程序运行环境而做一些额外的开发工作,进而降低热更新的复杂度。
以下以lua函数UI:OnButtonClick作为待更新的第一数据对象,进行技术方案的示例性说明。UI:OnButtonClick函数可用于在unity引擎中制作UI,例如,在游戏场景中制作UI。
在更新之前,UI:OnButtonClick的已有逻辑为:在点击关闭按钮时,关闭当前页面。Lua代码如下:
function NewOnButtonClick(self)
self:OpenOtherUI()
end
在此基础上,可将UI:OnButtonClick函数注册到UI按钮的回调中,注册过程对应的lua代码如下:
UIButton.AddClickCallBack(UI.OnButtonClick,self)
在完成回调函数的注册后,当发生电极关闭按钮事件时,会执行OnButtonClick函数对应的函数逻辑,也即是:关闭当前页面。
当前,用户期望更新UI:OnButtonClick函数的函数逻辑,修改为:在点击关闭按钮时,打开另一个页面。则本实施例提供的热更新方案中,可创建与该更新需求适配的新的lua函数,对应的lua代码为:
function NewOnButtonClick(self)
self:OpenOtherUI()
end
然后,将UI.OnButtonClick的函数原型指针,配置为指向NewOnButtonClick的函数原型。
通过上述过程,修改了UI.OnButtonClick函数的函数原型指针,即把UI.OnButtonClick的函数逻辑变为NewOnButtonClick的函数逻辑,实现了对UI.OnButtonClick函数的逻辑更新。
之后,在UI.OnButtonClick函数引用阶段,在UIButton.AddClickCallBack中注册的回调函数,依然是引用UI.OnButtonClick,而因为UI.OnButtonClick闭包中的函数原型指针已经被替换,所以引用UI.OnButtonClick实际指向的是NewOnButtonClick的函数原型,进而实现无感热加载了打开新UI的函数逻辑。
由于一个lua函数在虚拟机中实际为一个闭包,因此,其他任意逻辑对于lua函数的引用都是对闭包的引用,我们在没有修改闭包的情况下只修改了其中的函数原型指针,所以程序中任意地方在执行到这个lua函数的时候,自然会使用新的函数原型指针执行新的逻辑,也是因为这个原因,我们没有动到原逻辑中任意的数据部分(例如运行环境中的一些状态值,存储在upvalue表中),所以可以保证游戏的运行时环境不会被破坏,也就不需要开发者为了保留游戏运行时数据而做一些额外的开发工作。我们热更逻辑仅仅通过了几个变量赋值来实现,所以对于逻辑更新的性能是极为高效的。
需要说明的是,上述实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤100至步骤101的执行主体可以为设备A;又比如,步骤100和101的执行主体可以为设备A,步骤102的执行主体可以为设备B;等等。
另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如100、101等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的数据对象,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
上述实施例提供的热更新方法可以由一热更新装置来执行,图3为本申请一示例性实施例提供的一种热更新装置的结构示意图。参考图3,该热更新装置可包括:
确定模块30,设置为响应于热更新指令,确定待更新的第一数据对象;
加载模块31,设置为创建符合更新需求的第二数据对象,以获得第二数据对象对应的目标函数原型;
替换模块32,设置为将第一数据对象的函数原型替换为目标函数原型,以对第一数据对象进行热更新。
本实施例提供的热更新方法可应用于各种需要进行热更新的场景中,例如,对游戏程序或其它应用程序进行热更新的场景等。本实施例对应用场景不做限定。其中,在不同的应用场景中,采用的程序语言可能不完全相同。而在不同的程序语言下,数据对象的实现形式可以是多种多样的。例如,在lua语言下,数据对象可以是lua函数。
本实施例中,用户可在需要进行热更新的情况下,发起热更新指令。这里的用户可以是开发者等。另外,本实施例中,不限定热更新指令的发起形式。
基于此,确定模块30可响应于热更新指令,确定待更新的第一数据对象。例如,在lua语言下,用户想要更新UI:OnButtonClick函数,则可将UI:OnButtonClick函数作为第一数据对象。
根据更新需求,用户可创建第二数据对象。例如,在lua语言下,加载模块31可通过执行一个形如function...end这样的表达式,来创建个新的数据对象。实际应用中,在Lua中编译一个函数时,会为该lua函数生成一个函数原型(prototype),函数原型中包含了函数体对应的虚拟机指令、函数用到的常量值(数,文本字符串等等)和一些调试信息等,函数原型可用于表征lua函数的函数逻辑。
加载模块31,可创建符合更新需求的第二数据对象,以获得第二数据对象对应的目标函数原型。其中,目标函数原型所表征的函数逻辑,即为用户期望更新至第一数据对象中的函数逻辑。
在此基础上,替换模块32,可将第一数据对象的函数原型替换为目标函数原型,以对第一数据对象进行热更新。
通过将第一数据对象的函数原型替换为目标函数原型,替换模块32可将第一数据对象的函数逻辑替换为第二数据对象的函数逻辑,从而实现对第一数据对象的更新。而在后续的数据对象引用阶段,由于通常是以数据对象为整体作为引用基础,因此,无论第一数据对象是否已经加载到内存,还是已经注册到其它语言层,只要引用到第一数据对象,都会按照更新后的函数逻辑进行执行,从而可实现对第一数据对象的热更新。
据此,本实施例中,可响应于热更新指令,确定待更新的第一数据对象;创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。据此,本申请实施例中,可通过替换第一数据对象对应的函数原型的方式来更新第一数据对象的逻辑,这样,对于已经加载到内存或者注册到其它语言层的数据对象,也能够实现热更新,而不再需要针对每一处数据对象进行单独处理,因此,可有效降低热更新的复杂度,提高热更新的性能。
在上述或下述实施例中,替换模块32可在第一数据对象和第二数据对象之间交换函数原型,以实现将第一数据对象的函数原型替换为目标函数原型。
在一种可选的实现方式中,替换模块32可将第一数据对象的函数原型指针配置为指向目标函数原型,其中,第一数据对象中包含函数原型指针。
例如,在lua语言下,一个lua函数在虚拟机中通常是一个lua闭包(closure)。在数据结构上,lua闭包包含垃圾回收头、函数原型指针和upvalue表等。在Lua函数对应的lua闭包中,替换模块32可将函数原型指针配置为指向lua函数的原始函数原型,以支持对lua函数的引用。
在该实现方式中,替换模块32可将第二数据对象包含的函数原型指针的数据赋值给第一数据对象包含的函数原型指针,其中,第二数据对象包含的函数原型指针指向目标函数原型,以将第一数据对象的函数原型指针配置为指向目标函数原型。
另外,在该实现方式中,替换模块32可将第一数据对象包含的函数原型指针赋值给一中间变量,之后,在将第二数据对象包含的函数原型指针赋值给第一数据对象包含的函数原型指针,最后,再将中间变量的当前值赋值给第二数据对象包含的函数原型指针,从而实现第一数据对象和第二数据对象之间函数原型指针的交换。当然,还可直接将第二数据对象包含的函数原型指针赋值给第一数据对象包含的函数原型指针,这种情况下,第一数据对象包含的原始的函数原型指针将被丢弃,但这不影响本实施例中热更新方案的实施。本实施例对此不做限定。
据此,在该实现方式中,替换模块32可通过修改第一数据对象包含的函数原型指针,来重新指定第一数据对象对应的函数原型,从而达到对第一数据对象进行热更新的目标。
在另一种实现方式中,替换模块32可:
创建临时变量;
将第一数据对象对应的函数原型的数据赋值给临时变量;
将目标函数原型的数据赋值给第一数据对象对应的函数原型;
将临时变量的数据赋值给目标函数原型,以交换第一数据对象对应的函数原型和目标函数原型的数据。
在该实现方式中,替换模块32可通过一临时变量,实现第一数据对象和第二数据对象之间函数原型的交换。
据此,在该实现方式中,替换模块32无需对第一数据对象中的函数原型指针进行修改,而是直接对第一数据对象对应的函数原型进行修改。该实现方式,同样可重新指定第一数据对象对应的函数原型,从而达到对第一数据对象进行热更新的目标。
当然,本实施例中,替换模块32还可采用其它实现方式实现在第一数据对象和第二数据对象之间交换函数原型,本实施例并不限于此。
另外,本实施例中,如前文提及的,第一数据对象中除了包含函数原型指针外,还可包含upvalue表等其它数据,本实施例中,替换模块32可在热更新过程中,保持第一数据对象中包含的函数原型指针之外的数据不变。例如,在lua语音下,可保持第一数据对象中的upvalue表不变。由于程序运行环境中的一些状态值存储在upvalue表中,因此,保持upvalue表不变,可保证程序运行环境不被破坏,也就不需要开发者为保留程序运行环境而做一些额外的开发工作,进而降低热更新的复杂度。
值得说明的是,上述关于热更新装置各实施例中的技术细节,可参考前述的热更新方法实施例中的相关描述,为节省篇幅,在此不再赘述,但这不应造成本申请保护范围的损失。
上述实施例中的热更新装置可以实现为软件或实现为软件和硬件的组合,该热更新装置可集成设置在计算设备中。图4为本申请一示例性实施例提供的一种计算设备的结构示意图。如图4所示,该计算设备可包括:存储器40和处理器41。
存储器40,用于存储计算机程序,并可被配置为存储其它各种数据以支持在计算平台上的操作。这些数据的示例包括用于在计算平台上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。
存储器40可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
处理器41,与存储器40耦合,用于执行存储器40中的计算机程序,以用于:
响应于热更新指令,确定待更新的第一数据对象;
创建符合更新需求的第二数据对象,以获得第二数据对象对应的目标函数原型;
将第一数据对象的函数原型替换为目标函数原型,以对第一数据对象进行热更新。
本实施例提供的热更新方法可应用于各种需要进行热更新的场景中,例如,对游戏程序或其它应用程序进行热更新的场景等。本实施例对应用场景不做限定。其中,在不同的应用场景中,采用的程序语言可能不完全相同。而在不同的程序语言下,数据对象的实现形式可以是多种多样的。例如,在lua语言下,数据对象可以是lua函数。
本实施例中,用户可在需要进行热更新的情况下,发起热更新指令。这里的用户可以是开发者等。另外,本实施例中,不限定热更新指令的发起形式。
基于此,处理器41可响应于热更新指令,确定待更新的第一数据对象。例如,在lua语言下,用户想要更新UI:OnButtonClick函数,则可将UI:OnButtonClick函数作为第一数据对象。
根据更新需求,用户可创建第二数据对象。例如,在lua语言下,处理器41可通过执行一个形如function...end这样的表达式,来创建个新的数据对象。实际应用中,在Lua中编译一个函数时,会为该lua函数生成一个函数原型(prototype),函数原型中包含了函数体对应的虚拟机指令、函数用到的常量值(数,文本字符串等等)和一些调试信息等,函数原型可用于表征lua函数的函数逻辑。
处理器41,可创建符合更新需求的第二数据对象,以获得第二数据对象对应的目标函数原型。其中,目标函数原型所表征的函数逻辑,即为用户期望更新至第一数据对象中的函数逻辑。
在此基础上,处理器41,可将第一数据对象的函数原型替换为目标函数原型,以对第一数据对象进行热更新。
通过将第一数据对象的函数原型替换为目标函数原型,处理器41可将第一数据对象的函数逻辑替换为第二数据对象的函数逻辑,从而实现对第一数据对象的更新。而在后续的数据对象引用阶段,由于通常是以数据对象为整体作为引用基础,因此,无论第一数据对象是否已经加载到内存,还是已经注册到其它语言层,只要引用到第一数据对象,都会按照更新后的函数逻辑进行执行,从而可实现对第一数据对象的热更新。
据此,本实施例中,可响应于热更新指令,确定待更新的第一数据对象;创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。据此,本申请实施例中,可通过替换第一数据对象对应的函数原型的方式来更新第一数据对象的逻辑,这样,对于已经加载到内存或者注册到其它语言层的数据对象,也能够实现热更新,而不再需要针对每一处数据对象进行单独处理,因此,可有效降低热更新的复杂度,提高热更新的性能。
在上述或下述实施例中,处理器41可在第一数据对象和第二数据对象之间交换函数原型,以实现将第一数据对象的函数原型替换为目标函数原型。
在一种可选的实现方式中,处理器41可将第一数据对象的函数原型指针配置为指向目标函数原型,其中,第一数据对象中包含函数原型指针。
例如,在lua语言下,一个lua函数在虚拟机中通常是一个lua闭包(closure)。在数据结构上,lua闭包包含垃圾回收头、函数原型指针和upvalue表等。在Lua函数对应的lua闭包中,处理器41可将函数原型指针配置为指向lua函数的原始函数原型,以支持对lua函数的引用。
在该实现方式中,处理器41可将第二数据对象包含的函数原型指针的数据赋值给第一数据对象包含的函数原型指针,其中,第二数据对象包含的函数原型指针指向目标函数原型,以将第一数据对象的函数原型指针配置为指向目标函数原型。
另外,在该实现方式中,处理器41可将第一数据对象包含的函数原型指针赋值给一中间变量,之后,在将第二数据对象包含的函数原型指针赋值给第一数据对象包含的函数原型指针,最后,再将中间变量的当前值赋值给第二数据对象包含的函数原型指针,从而实现第一数据对象和第二数据对象之间函数原型指针的交换。当然,还可直接将第二数据对象包含的函数原型指针赋值给第一数据对象包含的函数原型指针,这种情况下,第一数据对象包含的原始的函数原型指针将被丢弃,但这不影响本实施例中热更新方案的实施。本实施例对此不做限定。
据此,在该实现方式中,处理器41可通过修改第一数据对象包含的函数原型指针,来重新指定第一数据对象对应的函数原型,从而达到对第一数据对象进行热更新的目标。
在另一种实现方式中,处理器41可:
创建临时变量;
将第一数据对象对应的函数原型的数据赋值给临时变量;
将目标函数原型的数据赋值给第一数据对象对应的函数原型;
将临时变量的数据赋值给目标函数原型,以交换第一数据对象对应的函数原型和目标函数原型的数据。
在该实现方式中,处理器41可通过一临时变量,实现第一数据对象和第二数据对象之间函数原型的交换。
据此,在该实现方式中,处理器41无需对第一数据对象中的函数原型指针进行修改,而是直接对第一数据对象对应的函数原型进行修改。该实现方式,同样可重新指定第一数据对象对应的函数原型,从而达到对第一数据对象进行热更新的目标。
当然,本实施例中,处理器41还可采用其它实现方式实现在第一数据对象和第二数据对象之间交换函数原型,本实施例并不限于此。
另外,本实施例中,如前文提及的,第一数据对象中除了包含函数原型指针外,还可包含upvalue表等其它数据,本实施例中,处理器41可在热更新过程中,保持第一数据对象中包含的函数原型指针之外的数据不变。例如,在lua语音下,可保持第一数据对象中的upvalue表不变。由于程序运行环境中的一些状态值存储在upvalue表中,因此,保持upvalue表不变,可保证程序运行环境不被破坏,也就不需要开发者为保留程序运行环境而做一些额外的开发工作,进而降低热更新的复杂度。
进一步,如图4所示,该计算设备还包括:通信组件42、电源组件43等其它组件。图4中仅示意性给出部分组件,并不意味着计算设备只包括图4所示组件。
值得说明的是,上述关于计算设备各实施例中的技术细节,可参考前述的热更新方法实施例中的相关描述,为节省篇幅,在此不再赘述,但这不应造成本申请保护范围的损失。
相应地,本申请实施例还提供一种存储有计算机程序的计算机可读存储介质,计算机程序被执行时能够实现上述方法实施例中可由计算设备执行的各步骤。
上述图4中的通信组件,被配置为便于通信组件所在设备和其他设备之间有线或无线方式的通信。通信组件所在设备可以接入基于通信标准的无线网络,如WiFi,2G、3G、4G/LTE、5G等移动通信网络,或它们的组合。在一个示例性实施例中,通信组件经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件还包括近场通信(NFC)模块,以促进短程通信。例如,在NFC模块可基于射频识别(RFID)技术,红外数据协会(IrDA)技术,超宽带(UWB)技术,蓝牙(BT)技术和其他技术来实现。
上述图4中的电源组件,为电源组件所在设备的各种组件提供电力。电源组件可以包括电源管理系统,一个或多个电源,及其他与为电源组件所在设备生成、管理和分配电力相关联的组件。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (10)
1.一种热更新方法,其特征在于,包括:
响应于热更新指令,确定待更新的第一数据对象;
创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;
将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。
2.根据权利要求1所述的方法,其特征在于,所述将所述第一数据对象的函数原型替换为所述目标函数原型,包括:
在所述第一数据对象和所述第二数据对象之间,交换函数原型。
3.根据权利要求2所述的方法,其特征在于,所述第一数据对象包括函数原型指针,所述在所述第一数据对象和所述第二数据对象之间,交换函数原型,包括:
将所述第一数据对象的函数原型指针配置为指向所述目标函数原型。
4.根据权利要求3所述的方法,其特征在于,所述将所述第一数据对象的函数原型指针配置为指向所述目标函数原型,包括:
将所述第二数据对象包含的函数原型指针的数据赋值给所述第一数据对象包含的函数原型指针,其中,所述第二数据对象包含的函数原型指针指向所述目标函数原型。
5.根据权利要求2所述的方法,其特征在于,所述在所述第一数据对象和所述第二数据对象之间,交换函数原型,包括:
创建临时变量;
将所述第一数据对象对应的函数原型的数据赋值给所述临时变量;
将所述目标函数原型的数据赋值给所述第一数据对象对应的函数原型;
将所述临时变量的数据赋值给所述目标函数原型,以交换所述第一数据对象对应的函数原型和所述目标函数原型的数据。
6.根据权利要求1所述的方法,其特征在于,所述第一数据对象和所述第二数据对象为lua函数。
7.根据权利要求1所述的方法,其特征在于,所述第一数据对象中包含upvalue表,所述方法还包括:
在热更新过程中,保持所述第一数据对象中包含的upvalue表不变。
8.一种热更新装置,其特征在于,包括:
确定模块,设置为响应于热更新指令,确定待更新的第一数据对象;
加载模块,设置为创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;
替换模块,设置为将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。
9.一种计算设备,其特征在于,包括存储器和处理器;
所述存储器用于存储一条或多条计算机指令;
所述处理器与所述存储器耦合,用于执行所述一条或多条计算机指令,以用于:
响应于热更新指令,确定待更新的第一数据对象;
创建符合更新需求的第二数据对象,以获得所述第二数据对象对应的目标函数原型;
将所述第一数据对象的函数原型替换为所述目标函数原型,以对所述第一数据对象进行热更新。
10.一种存储计算机指令的计算机可读存储介质,其特征在于,当所述计算机指令被一个或多个处理器执行时,致使所述一个或多个处理器执行权利要求1-7任一项所述的热更新方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011011341.0A CN112162767A (zh) | 2020-09-23 | 2020-09-23 | 一种热更新方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011011341.0A CN112162767A (zh) | 2020-09-23 | 2020-09-23 | 一种热更新方法、装置、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112162767A true CN112162767A (zh) | 2021-01-01 |
Family
ID=73863468
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011011341.0A Pending CN112162767A (zh) | 2020-09-23 | 2020-09-23 | 一种热更新方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112162767A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023221654A1 (zh) * | 2022-05-20 | 2023-11-23 | 腾讯科技(深圳)有限公司 | 子程序更新方法、装置、电子设备、计算机可读存储介质和计算机程序产品 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160057111A1 (en) * | 2013-12-06 | 2016-02-25 | Shape Security, Inc. | Client/server security by an intermediary rendering modified in-memory objects |
CN110187910A (zh) * | 2019-05-30 | 2019-08-30 | 腾讯科技(上海)有限公司 | 一种热更新方法、装置、设备及计算机可读存储介质 |
-
2020
- 2020-09-23 CN CN202011011341.0A patent/CN112162767A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160057111A1 (en) * | 2013-12-06 | 2016-02-25 | Shape Security, Inc. | Client/server security by an intermediary rendering modified in-memory objects |
CN110187910A (zh) * | 2019-05-30 | 2019-08-30 | 腾讯科技(上海)有限公司 | 一种热更新方法、装置、设备及计算机可读存储介质 |
Non-Patent Citations (5)
Title |
---|
INEVERSLEEEEEP: "tolua:The fastest unity lua binding solution", pages 1 - 2, Retrieved from the Internet <URL:https://github.com/iNeverSleeeeep/tolua?tab=readme-ov-file> * |
云风: "在不同的 lua vm 间共享 Proto", pages 1 - 16, Retrieved from the Internet <URL:https://github.com/iNeverSleeeeep/tolua?tab=readme-ov-file> * |
八爪大头鱼: "Lua热更新解析", pages 1 - 8, Retrieved from the Internet <URL:https://blog.csdn.net/weixin_42437933/article/details/108146149> * |
姚二二姚: "lua闭包浅析", pages 1 - 2, Retrieved from the Internet <URL:https://www.cnblogs.com/yao2yaoblog/p/6413190.html> * |
野蛮生长的小VV: "c语言交换两个数的值的几种方法", pages 1 - 3, Retrieved from the Internet <URL:https://blog.csdn.net/weixin_42572273/article/details/86770638> * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2023221654A1 (zh) * | 2022-05-20 | 2023-11-23 | 腾讯科技(深圳)有限公司 | 子程序更新方法、装置、电子设备、计算机可读存储介质和计算机程序产品 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111666096B (zh) | 目标应用的热更新方法和装置、存储介质和电子设备 | |
CN107025559B (zh) | 一种业务处理方法及装置 | |
CN106796522B (zh) | 用于更新源代码文件的系统和方法 | |
CN113872948A (zh) | 一种执行智能合约的方法、区块链节点和节点设备 | |
CN102200911B (zh) | 变量闭包 | |
CN109117169A (zh) | 用于修复内核漏洞的方法和装置 | |
CN111061638B (zh) | 一种iOS系统调试的方法、装置及服务器 | |
CN111131352B (zh) | 主题切换方法及装置 | |
CN105511942A (zh) | 语言虚拟机中热点中间代码的识别方法以及装置 | |
CN109542506A (zh) | 一种可灵活配置接口和快速交付服务的系统 | |
CN114168111B (zh) | 组件化路由实现方法、设备、产品及存储介质 | |
CN103197962B (zh) | 多进程状态切换方法和装置 | |
CN103853535A (zh) | 修改中间件的方法和装置 | |
CN105474177B (zh) | 分布式处理系统、设备、方法和记录介质 | |
CN109344619A (zh) | 应用程序的热修复方法和装置 | |
CN110727482A (zh) | 一种界面的更新方法和装置 | |
CN104699503A (zh) | 一种替换安卓系统中函数的执行逻辑的方法及装置 | |
CN103092660A (zh) | 一种嵌入式设备出厂配置与生产配置的安全快速切换方法 | |
CN104657164A (zh) | 软件升级处理方法和装置 | |
CN112162767A (zh) | 一种热更新方法、装置、设备及存储介质 | |
CN115858154A (zh) | 一种异构加速方法、设备、系统及存储介质 | |
US10606612B2 (en) | Context check bypass to enable opening shared-object libraries | |
CN101986662B (zh) | 一种widget实例运行方法及系统 | |
CN114489947A (zh) | 容器的生命周期管理、函数计算方法、设备及存储介质 | |
CN112604273B (zh) | 数据驱动的游戏系统功能加载方法、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |