游戏数据的存盘方法、装置、设备和存储介质与流程

文档序号:17470936发布日期:2019-04-20 05:49阅读:372来源:国知局
本发明涉及电子游戏领域,尤其涉及一种游戏数据的存盘方法、装置、设备和存储介质。
背景技术
::游戏开发中需要将游戏运行时内存空间中的玩家数据进行持久化存储,其目的在于玩家重新登陆或者服务器重新启动后能够根据持久化数据恢复玩家在游戏里的角色信息,这个持久化存储的过程也叫存盘,无论是端游、页游、还是手游,存盘系统都是游戏服务器开发中非常重要的一个系统。目前,常用的存盘方案包括定时存盘以及增量存盘两种方案,定时存盘是很多产品在使用的一种机制。具体的实现中,游戏玩家平时的数据在内存中去操作,每隔一段时间,通常是10-20分钟,会将游戏玩家的数据做一次写数据库存盘操作,将数据存储在数据库中。增量存盘是在定时存盘的基础上进行改进的方案,每一秒查询内存中玩家是否有修改过的脏数据,如果有则将修改过的脏数据写在数据库中进行存储。然而,周期性存盘周期较长,一旦游戏异常退出或者服务器故障,存盘周期没到的数据就会丢失,增量存盘过程中需要在应用层修改存盘数据时需要手动将数据标记为脏数据,还需要每秒进行轮询查询脏数据,带来额外的中央处理器的开销。技术实现要素:本发明提供一种游戏数据的存盘方法、装置、设备和存储介质,用于解决现有技术中数据丢失或者增大中央处理器开销的问题。本发明第一方面提供一种游戏数据的存盘方法,在游戏启动运行后,实时监控所述游戏中预设类型的数据是否发生变化;若所述游戏中存在预设类型的第一数据发生变化,则将变化后的第一数据写入数据库进行存盘。具体的,所述预设类型包括多个数据类型。在一种具体的实现方式中,所述变化后的第一数据包括:所述第一数据的数据属性名,所述变化后的第一数据的值,所述变化后的第一数据的父对象,所述第一数据对应的拥有者。在一种具体的实现方式中,所述在游戏启动运行后,实时监控所述游戏中预设类型的数据是否发生变化之前,所述方法还包括:接收存盘数据类型设置指令;根据所述存盘数据类型设置指令,设置所述游戏中需要进行实时存盘的所述数据类型。在一种具体的实现方式中,所述将变化后的所述第一数据写入数据库进行存盘,包括:向所述游戏的客户端发送存盘指令,以使所述游戏的客户端根据所述存盘指令将所述变化后的第一数据写入数据库中进行存盘;所述第一数据中包括一个或者多个变化后的数据。本发明第二方面提供一种游戏数据的存盘装置,包括:监控模块,用于在游戏启动运行后,实时监控所述游戏中预设类型的数据是否发生变化;处理模块,用于若所述游戏中存在预设类型的第一数据发生变化,则将变化后的所述第一数据写入数据库进行存盘。具体的,所述预设类型包括多个数据类型。可选的,所述变化后的第一数据包括:所述第一数据的数据属性名,所述变化后的第一数据的值,所述变化后的第一数据的父对象,所述第一数据对应的拥有者。在一种具体的实现方式中,所述装置还包括:接收模块,用于接收存盘数据类型设置指令;所述处理模块还用于根据所述存盘数据类型设置指令,设置所述游戏中需要进行实时存盘的所述数据类型。在一种具体的实现方式中,所述处理模块具体用于:向所述游戏的客户端发送存盘指令,以使所述游戏的客户端根据所述存盘指令将所述第一数据写入数据库中进行存盘;所述第一数据中包括一个或者多个变化后的数据。本发明第三方面提供一种电子设备,包括:处理器和存储器;存储器用于存储程序和数据,所述处理器调用存储器存储的程序,以执行第一方面任一项所述的游戏数据的存盘方法。本发明第三方面提供一种计算机可读存储介质,所述计算机可读存储介质包括程序,所述程序在被处理器执行时用于执行第一方面任一项所述的游戏数据的存盘方法。本发明实施例提供的一种游戏数据的存盘方法、装置、设备和存储介质,在游戏启动运行后,实时监控所述游戏中预设类型的数据是否发生变化,若所述游戏中存在预设类型的第一数据发生变化,则将变化后的第一数据写入数据库进行存盘。实现了游戏数据的实时存储,降低了带宽的开销以及中央处理器的开销。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本发明一实施例提供的一种游戏数据的存盘方法实施例一的流程示意图;图2为本发明一实施例提供的一种游戏数据的存盘方法实施例二的流程示意图;图3为本发明一实施例提供的一种游戏数据的存盘装置实施例一的结构示意图;图4为本发明一实施例提供的一种游戏数据的存盘装置实施例二的结构示意图;图5为本发明一实施例提供的一种电子设备实施例一的结构示意图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。现有技术中,定时存盘是将所有数据存盘,由于数据量比较大,所以间隔时间相对较长,在存盘间隔期,内存中数据和数据库中数据存在一致性问题,一旦进程异常退出或者服务器故障,还未同步的数据会丢失,将导致玩家存盘数据不是最新的而产生回档或者物品复制,回档程度取决于存盘时间间隔,这对游戏运营来说是一个很严重的问题。而增量存盘因为只存脏数据,数据量相对较小,所以存盘的频率较高,通常为每秒一次,该方案比较接近实时存盘,可以一定程度上降低回档损失,但是应用层修改存盘数据时需要手动将数据标记为脏数据,当修改存盘数据频率很低时,每秒一次的轮询查询脏数据会带来额外的cpu开销,当在线玩家数量巨大时,这个开销是不容忽略的。针对现有技术中的问题,本方案提供了一种游戏数据的存盘方法,通过监控游戏数据的变化,对游戏数据进行实时更新,并通过合批存盘,在维持较低的中央处理器开销的情况下实现了游戏数据的实时存储。为便于理解,首先对以下技术名词进行解释:python:一种解释型、面向对象、动态数据类型的高级程序设计语言。脏数据:内存中进行修改,但还没有更新到数据库中的数据。图1为本发明一实施例提供的一种游戏数据的存盘方法实施例一的流程示意图。该方法的执行主体可以是游戏软件/客户端的后台服务器,但不以此为限。如图1所示,该方法包括:s101:在游戏启动运行后,实时监控游戏中预设类型的数据是否发生变化。其中,数据类型包括可变数据类型(mutable数据)和不可变数据类型(immutable数据)。可变数据类型包括:列表(list)、字典(dict)、集合(set)等。不可变数据类型包括:整型(int)、字符串型(string)、元组(tuple)等。预设类型为本方案中预设的需要对其进行实时监控的数据类型,一般是上述的可变数据类型,可以包括其中的一种或者多种。在本步骤中,应理解,在游戏启动运行后,即对预设类型中的可变数据类型进行实时的监控,包括对可变数据类型的属性和内容进行实时监控,以使数据发生变化时进行存盘操作。s102:若所述游戏中存在预设类型的第一数据发生变化,则将变化后的第一数据写入数据库进行存盘。第一数据可以是预设类型中的一种可变数据类型的数据,也可是预设类型中的多个可变数据类型的数据。该第一数据包括:第一数据的数据属性名,变化后的第一数据的值,变化后的第一数据的父对象,第一数据对应的拥有者。其中,第一数据的数据属性名和变化后的第一数据的值若发生变化,则表明第一数据发生变化;当发生变化的第一数据为内嵌数据时,则记录变化后的第一数据的父对象和第一数据对应的拥有者。在游戏的过程中,若预设类型的第一数据发生变化,则将变化后的第一数据写入数据库进行存盘。具体的,若第一数据的属性名或者值发生变化,可以通过调用回调函数进行实时存盘;若第一数据为内嵌数据,则记录变化后的第一数据的父对象,通过调用父对象的回调函数进行实时存盘。将变化后的第一数据写入数据库进行存盘,具体为,向该游戏的客户端发送存盘指令,该游戏的客户端根据接收到的存盘指令将变化后的第一数据写入数据库中进行存盘,该第一数据可以包括一个或者多个数据,即可以使用同一条存盘指令存储一个变化后的数据或者多个变化后的数据。可选的,可以通过远程过程调用(remoteprocedurecall,rpc)将存盘指令发送到存盘进程写数据库存盘。在一种具体的实现方式中,在游戏进行中经常在一帧同时有大量数据发生变化,相应的,需要对大量数据进行存盘。而每次存盘需要进行远程过程调用,并对数据库进行操作,为减少远程过程调用次数和对数据库的操作次数,本方案提供一种合批存盘方案,将同一帧中的多个变化了的数据对应的多条存盘指令合批成一条存盘指令,并将存盘指令发送到存盘进程,进而,只需进行一次远程过程调用和一次存盘操作即可完成多条脏数据的存盘,有效降低了中央处理器的开销。本实施例提供的一种游戏数据的存盘方法,在游戏启动运行后,实时监控所述游戏中预设类型的数据是否发生变化,若所述游戏中存在预设类型的第一数据发生变化,则将变化后的第一数据写入数据库进行存盘。实现了游戏数据的实时存储,降低了带宽的开销以及中央处理器的开销。图2为本发明一实施例提供的一种游戏数据的存盘方法实施例二的流程示意图。在图1所示实施例的基础上,在步骤s101之前,如图2所示,该方法还包括:s103:接收存盘数据类型设置指令。s104:根据存盘数据类型设置指令,设置游戏中需要进行实时存盘的数据类型。在游戏运行时,给玩家的类绑定需要实时存盘的属性变量,即对需要监控的数据类型进行监控和存盘,而对于其他获取、使用和修改存盘属性的操作均不执行,因此需要对存盘的数据类型进行设置,可以根据设计者的操作选择的数据类型进行设置,也可以根据接收到的存盘数据类型设置指令设置哪些数据类型需要进行实时存盘。在上述实施例的基础上,下面以python计算机语言为例,通过一种具体的实现方式对本方案的游戏数据的存盘方法进行详细说明。本发明提供一种对象属性绑定方案,该方案基于python的描述符实现,python的描述符是一个绑定行为的对象属性,在描述符协议中,我们可以通过重写属性的访问方法实现对存盘属性的监控。这些方法包括_get_,_set_,_getitem_,_setitem_,_delitem_,_getattr_等。首先把python的数据类型按可变数据类型和不可变数据类型两类。其次定义一个monitor属性监控类,并将list,dict,set中能够改变数据的方法列出。_init_函数里会对属性做一些初始化,包括实际值、monitor属性对象在拥有者owner上的属性名、值发生修改时的回调函数(进行存盘操作)、如果是内嵌数据(list,dict的value),则记录父monitor对象、monitor属性对象的拥有者。当monitor对象拥有者owner通过owner.attr_name方式获取属性时,会调用monitor类的_get_函数,先从owner._dict_里获取原生数据,如果是不可变数据,则直接返回,否则创建一个monitor属性监控对象返回。当monitor对象拥有者owner通过owner.attr_name=xxx方式设置属性时,会调用monitor类的_set_函数,先设置owner._dict_,然后调用属性修改的回调函数进行实时存盘当monitor对象拥有者owner通过owner.attr_name[key]方式获取dict内容时,会调用monitor类的__getitem__函数,先获取原生数据,如果是不可变数据则直接返回,否则生成新的monitor对象返回,并设置父子关系,设置父子关系目的是子monitor属性改变时能一层层通过父monitor通知到owner。当monitor对象拥有者owner通过owner.attr_name[key]=xxx或者通过delowner.attr_name[key]方式修改和删除数据时,会分别调用monitor的_setitem_和_delitem_函数,修改后会调用属性修改的回调函数进行实时存盘。对于可变数据类型(list,dict,set)的monitor对象,monitor类重载了_getattr_方法,会修改数据内容的函数调用,在调用后都会通知回调函数进行存盘。对于数据修改的回调函数实现则较为简单,如果有父monitor则调用父monitor的回调,否则直接调用回调函数存盘。回调函数_value_changed_cb的具体实现就是获取self._owner(玩家)内存空间里变量名为self._attr_name属性的值,然后通过rpc发送指令到存盘进程写数据库存盘。有了这套属性监控类,我们就可以监控存盘属性的修改,并将修改后的脏数据实时存盘,考虑到游戏逻辑中经常在一帧同时修改很多存盘数据,例如如下操作:owner.save_attr1=val1owner.save_attr2=val2…owner.save_attr100=val100同时对100个属性做了修改,如果每个修改都发一条类似{"save_attr1":val1}的存盘指令,不仅增加了rpc调用次数,也增加了对数据库的操作次数,基于此考虑,我们采取了合批存盘方案,将同一帧里的多个存盘属性修改,合批成一条{"save_attr1":val1,"save_attr2":val2..."save_attr100":val100}的存盘指令发送到存盘进程,只需要一条rpc和一次存盘操作即可完成多条脏数据的存盘,有效降低了开销。对于现有的游戏,只需要在程序运行时给玩家的类(假设类名为playerclass)调用playerclass.bind_realtime_save_attr()绑定需要实时存盘的属性变量即可,其余获取、使用、修改存盘属性的代码,不需做任何改动,即可实现快速合入该游戏数据的存盘方法。在游戏服务器用实际案例验证该游戏数据的存盘方法,对于immutable数据(int类型举例)在内存中修改和查看数据过程如下:>>>player.gold=100#内存中设置变量gold属性为100>>>player.gold100#内存中获取gold值为100修改后对应数据库中数据如下:{“_id”:objectid(“5bdaae9cffd52a1164f6d071”),“gold”:100#数据库中gold字段立刻变为100对于mutalbe数据(dict类型举例)内存中修改和查看数据过程如下:>>>self.skill={"first":1001}#设置skill属性为{"first":1001}>>>self.skillmonitorobj:{"first:1001}>>>self.skill["second"]=1002#给skill添加"second"新字段>>>self.skillmonitorobj:{"second":1002,'first':1001)}>>>delself.skill["first"]#删除skill的"first"字段>>>self.skillmonitorobj:{'second':1002}修改后对应数据库中数据变化如下:mongos>db.entities.find({'uid':47198},{'skil1':1}){"_id":objectid("5bdaae9cffd52a1164f6d071"),"skill”:{"first":1001}}#设置skill后数据库立刻更新和内存中一样mongos>db.entities.find({'uid':47198},{'skil1':1}){"_id":objectid("5bdaae9cffd52a1164f6d071"),"skill”:{"second":1002,"first":1001}}#增加second后,数据库立刻更新mongos>db.entities.find({'uid':47198},{'skil1':1}){"_id":objectid("5bdaae9cffd52a1164f6d071"),"skill”:{"second":1002}}#删除first后,数据库和内存数据同步更新从验证结果可以看到,实际效果和预期一致,数据库能实时更新到内存中存盘数据的修改。图3为本发明一实施例提供的一种游戏数据的存盘装置实施例一的结构示意图。如图3所示,本实施例提供的一种游戏数据的存盘装置10包括:监控模块101:用于在游戏启动运行后,实时监控所述游戏中预设类型的数据是否发生变化;处理模块102:用于若所述游戏中存在预设类型的第一数据发生变化,则将变化后的所述第一数据写入数据库进行存盘。本实施例提供的一种游戏数据的存盘装置,包括监控模块和处理模块,监控模块用于在游戏启动运行后,实时监控所述游戏中预设类型的数据是否发生变化,处理模块用于若所述游戏中存在预设类型的第一数据发生变化,则将变化后的所述第一数据写入数据库进行存盘。实现了游戏数据的实时存储,降低了带宽的开销以及中央处理器的开销。在上述实施例的基础上,该游戏数据的存盘装置10还包括以下几种实现方式。在一种具体的实现方式中,所述预设类型包括多个数据类型。在一种具体的实现方式中,所述变化后的第一数据包括:所述第一数据的数据属性名,所述变化后的第一数据的值,所述变化后的第一数据的父对象,所述第一数据对应的拥有者。图4为本发明一实施例提供的一种游戏数据的存盘装置实施例二的结构示意图。如图4所示,该游戏数据的存盘装置10还包括:接收模块103,用于接收存盘数据类型设置指令;所述处理模块102还用于根据所述存盘数据类型设置指令,设置所述游戏中需要进行实时存盘的所述数据类型。在一种具体的实现方式中,处理模块102具体用于:向所述游戏的客户端发送存盘指令,以使所述游戏的客户端根据所述存盘指令将所述第一数据写入数据库中进行存盘;所述第一数据中包括一个或者多个变化后的数据。本实施例提供的电子设备,可以执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。图5为本发明一实施例提供的一种电子设备实施例一的结构示意图,如图5所示,本实施例提供的电子设备20可以包括:存储器201、处理器202;可选的还可以包括总线203。其中,总线203用于实现各元件之间的连接。所述存储器201存储计算机执行指令;所述至少一个处理器202执行所述存储器201存储的计算机执行指令,使得所述处理器执行前述任一项实施例提供的游戏数据的存盘方法。其中,存储器201和处理器202之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可以通过一条或者多条通信总线或信号线实现电性连接,如可以通过总线203连接。存储器201中存储有实现数据访问控制方法的计算机执行指令,包括至少一个可以软件或固件的形式存储于存储器201中的软件功能模块,处理器202通过运行存储在存储器201内的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器201可以是,但不限于,随机存取存储器(randomaccessmemory,简称:ram),只读存储器(readonlymemory,简称:rom),可编程只读存储器(programmableread-onlymemory,简称:prom),可擦除只读存储器(erasableprogrammableread-onlymemory,简称:eprom),电可擦除只读存储器(electricerasableprogrammableread-onlymemory,简称:eeprom)等。其中,存储器201用于存储程序,处理器202在接收到执行指令后,执行程序。进一步地,上述存储器201内的软件程序以及模块还可包括操作系统,其可包括各种用于管理系统任务(例如内存管理、存储设备控制、电源管理等)的软件组件和/或驱动,并可与各种硬件或软件组件相互通信,从而提供其他软件组件的运行环境。处理器202可以是一种集成电路芯片,具有信号的处理能力。上述的处理器202可以是通用处理器,包括中央处理器(centralprocessingunit,简称:cpu)、网络处理器(networkprocessor,简称:np)等。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。本发明实施例还提供一种计算机可读存储介质,其上存储有计算机执行指令,计算机执行指令被处理器执行时可以实现上述任一方法实施例提供的访问指令的处理方法。本实施例中的计算机可读存储介质可以是计算机能够存取的任何可用介质,或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备,可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如ssd)等。本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1