一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

数据处理方法、装置、存储介质和电子装置与流程

2022-12-19 21:07:20 来源:中国专利 TAG:


1.本公开涉及计算机领域,具体而言,涉及一种数据处理方法、装置、存储介质和电子装置。


背景技术:

2.目前,针对游戏状态进行复盘的问题,通常使用帧同步或者状态同步进行游戏的复盘,但是,状态同步游戏的复盘功能往往实现十分困难,因此,仍存在对游戏状态进行复盘的效率低的技术问题。
3.针对上述对游戏状态进行复盘的效率低的技术问题,目前尚未提出有效的解决方案。


技术实现要素:

4.本公开至少部分实施例提供了一种数据处理方法、装置、存储介质和电子装置,以至少解决对游戏状态进行复盘的效率低的技术问题。
5.根据本公开其中一实施例,提供了一种数据处理方法,包括:获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;确定每组子进程对应的运行数据,得到多组运行数据;响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。
6.可选地,获取战斗服务器中游戏进程的子进程,包括:调用分叉函数,在战斗服务器中复制游戏进程,得到子进程。
7.可选地,每隔目标时间周期,对分叉函数进行调用。
8.可选地,每隔目标时间周期,响应于停止请求,停止运行子进程。
9.可选地,确定每组子进程对应的运行数据,包括:分别对每组子进程进行序列化处理,得到每组子进程对应的运行数据。
10.可选地,将多组运行数据分别存储至多组数据库中;基于每组数据库中存储的运行数据的停止时刻和游戏中战斗名称,分别确定每组数据库的数据库名称,其中,战斗名称用于表征游戏中的战斗场次。
11.可选地,响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据,包括:基于游戏运行请求中的停止时刻、游戏运行请求中的战斗名称和数据库名称,从多组数据库中确定与游戏运行请求匹配的数据库,得到目标数据库;将目标数据库中存储的运行数据确定为目标运行数据。
12.可选地,基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态,包括:对目标运行数据进行反序列化处理,得到游戏的还原数据;基于还原数据确定运行状态。
13.根据本公开其中一实施例,还提供了一种数据处理装置,包括:获取单元,用于获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进
程包括子进程;第一确定单元,用于确定每组子进程对应的运行数据,得到多组运行数据;第二确定单元,用于响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;第三确定单元,用于基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。
14.根据本公开其中一实施例,还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,计算机程序被设置为运行时执行上述任一项中的数据处理方法。
15.根据本公开其中一实施例,还提供了一种电子装置,包括存储器和处理器,存储器中存储有计算机程序,处理器被设置为运行计算机程序以执行上述任一项中的数据处理方法。
16.在本公开实施例中,获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;确定每组子进程对应的运行数据,得到多组运行数据;响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。也就是说,本公开实施例通过对游戏进程进行复制得到子进程,基于子进程对应的运行数据,确定目标运行数据,通过对目标运行数据进行处理,实现了提高对游戏状态进行复盘的效率的技术效果,解决了对游戏状态进行复盘的效率低的技术问题。
附图说明
17.此处所说明的附图用来提供对本公开的进一步理解,构成本公开的一部分,本公开的示意性实施例及其说明用于解释本公开,并不构成对本公开的不当限定。在附图中:
18.图1是本公开实施例的一种数据处理方法的移动终端的硬件结构框图;
19.图2是根据本公开其中一实施例的数据处理方法的流程图;
20.图3是根据相关技术其中一实施例的帧同步的示意图;
21.图4是根据相关技术其中一实施例的状态同步的示意图;
22.图5是根据本公开其中一实施例的游戏复盘的流程图;
23.图6是根据本公开其中一实施例的游戏数据逻辑执行的示意图;
24.图7是根据本公开其中一实施例的战斗树引用关系的示意图;
25.图8是根据本公开实施例的一种数据处理装置的结构框图;
26.图9是根据本公开实施例的一种电子装置的示意图。
具体实施方式
27.为了使本技术领域的人员更好地理解本公开方案,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分的实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本公开保护的范围。
28.需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用
的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
29.在一种可能的实施方式中,针对计算机领域下,针对游戏的快速复盘通常所采用的是帧同步或状态同步的方法进行游戏复盘,发明人经过实践并仔细研究后,发现当前技术仍然存在由于不同游戏的基础架构不同,进行状态同步的数据量大,因此,仍存在对游戏进行快速复盘的效率低的技术问题,基于此,本公开实施例应用的游戏场景可以是多人在线类游戏场景,所针对的游戏类型一般是竞技类游戏,提出了一种数据处理的方法,获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;确定每组子进程对应的运行数据,得到多组运行数据;响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态,达到了可以对游戏进行快速复盘的目的,实现了提高对游戏状态进行复盘的效率的技术效果,解决了对游戏状态进行复盘的效率低的技术问题。
30.根据本公开其中一实施例,提供了一种数据处理方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
31.该方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,该移动终端可以是智能手机(如android手机、ios手机等)、平板电脑、掌上电脑以及移动互联网设备(mobile internet devices,简称为mid)、pad、游戏机等终端设备。图1是本公开实施例的一种数据处理方法的移动终端的硬件结构框图。如图1所示,移动终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于中央处理器(cpu)、图形处理器(gpu)、数字信号处理(dsp)芯片、微处理器(mcu)、可编程逻辑器件(fpga)、神经网络处理器(npu)、张量处理器(tpu)、人工智能(ai)类型处理器等的处理装置)和用于存储数据的存储器104。可选地,上述移动终端还可以包括用于通信功能的传输设备106、输入输出设备108以及显示设备110。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
32.存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本公开实施例中的数据处理方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的数据处理方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
33.传输设备106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括
移动终端的通信供应商提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(network interface controller,简称为nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(radio frequency,简称为rf)模块,其用于通过无线方式与互联网进行通讯。
34.输入输出设备108中的输入可以来自多个人体学接口设备(human interface device,简称为hid)。例如:键盘和鼠标、游戏手柄、其他专用游戏控制器(如:方向盘、鱼竿、跳舞毯、遥控器等)。部分人体学接口设备除了提供输入功能之外,还可以提供输出功能,例如:游戏手柄的力反馈与震动、控制器的音频输出等。
35.显示设备110可以例如平视显示器(hud)、触摸屏式的液晶显示器(lcd)和触摸显示器(也被称为“触摸屏”或“触摸显示屏”)。该液晶显示器可使得用户能够与移动终端的用户界面进行交互。在一些实施例中,上述移动终端具有图形用户界面(gui),用户可以通过触摸触敏表面上的手指接触和/或手势来与gui进行人机交互,此处的人机交互功能可选的包括如下交互:创建网页、绘图、文字处理、制作电子文档、游戏、视频会议、即时通信、收发电子邮件、通话界面、播放数字视频、播放数字音乐和/或网络浏览等、用于执行上述人机交互功能的可执行指令被配置/存储在一个或多个处理器可执行的计算机程序产品或可读存储介质中。
36.在一种可能的实施方式中,本公开实施例提供了一种数据处理方法,图2是根据本公开其中一实施例的数据处理方法的流程图,如图2所示,该方法可以包括如下步骤:
37.步骤s202,获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,包括游戏中,游戏进程包括子进程。
38.在本公开上述步骤s202提供的技术方案中,可以获取战斗服务器中游戏进程的多个时刻子进程,得到多组子进程,其中,游戏进程可以用于表征游戏进行的过程,可以包括子进程,又可以称为父进程,子进程可以用于表征在不同时刻的游戏进行的过程。
39.举例而言,可以将不同时刻的游戏进程复制至其他战斗服务器中,得到多组不同时刻的子进程。
40.步骤s204,确定每组子进程对应的运行数据,得到多组运行数据。
41.在本公开上述步骤s204提供的技术方案中,可以分别对子进程进行处理,得到每组子进程对应的运行数据,其中,运行数据可以为进过处理之后得到的可以传输的数据。
42.可选地,可以对子进程中进行处理,从而将子进程转换为可保持或者可传输的数据(运行数据),以实现数据传输的目的,对于子进程中不同的格式的数据可以采用不同的处理方式,此处不对将子进程转化为可传输数据的方式做具体限制。
43.举例而言,可以将不同时刻的游戏进程复制至其他战斗服务器中,复制得到多组子进程,分别对每组子进程中进行序列化处理,从而将子进程中转换为可以存储传输的数据,得到每组子进程对应的运行数据。
44.步骤s206,响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据。
45.在本公开上述步骤s206提供的技术方案中,可以在客户端发送游戏运行请求,响应于游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据,其中,游戏运行请求可以为游戏运营指令,可以包括需要复盘的游戏信息和需要复盘的时刻;游戏
信息可以为游戏名称或可以为用于表示游戏中的战斗场次信息。
46.举例而言,当需要复盘时,可以在客户端输入需要复盘的游戏信息,比如,输入战斗场次信息(战斗id)和需要复盘的时刻,获取由客户端发出的游戏运行请求,响应于游戏运行请求中的战斗场次信息和需要复盘的时刻,将游戏复盘请求发送到对应的战斗服上,可以根据游戏运行请求中的时刻向前/向后找到最靠近该时刻的录像存档时刻,生成指令(key),并从数据库中下载该时刻对应的数据,得到目标运行数据。
47.可选地,在客户端输入需要复盘的游戏信息可以有多种方式,比如,当游戏中途掉线的时候,可以通过在客户端登录游戏软件,选择之间进入的游戏场次,上述点击操作可以发出对应的游戏运行请求,基于游戏运行请求,确定与游戏运行请求对应的目标运行数据,其中,此时需要复盘的时刻可以为当前的登录时刻。
48.步骤s208,基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。
49.在本公开上述步骤s208提供的技术方案中,从多组运行数据中选择满足游戏运行请求的运行数据,得到目标运行数据,可以通过对目标运行数据进行处理,还原出游戏中虚拟对象在目标时刻的运行状态,其中,虚拟对象可以为游戏中的虚拟游戏对象;运行状态可以用于表征虚拟游戏对象的状态,比如,可以为虚拟游戏对象的生命值,武力值等;目标时刻可以为游戏运行请求中由客户端选择的时刻。
50.举例而言,可以对目标运行数据进行处理,得到与目标运行数据对应的用于表征虚拟游戏对象在目标时刻运行状态的数据,可以为游戏相关的信息,比如,战斗所处的战斗服务器地址,同步给参与本场战斗的所有玩家和所处游戏服务器进程内的虚拟对象(avatar),更新虚拟对象的状态为战斗中状态,可以通知玩家重新登陆,重新登录的时候可以检测虚拟对象的状态为战斗中,通过之前同步的战斗id和所处的战斗服务器地址,即可连入战斗,连入战斗后战斗处于暂停状态,可以手动结束暂停之后便可以继续进行游戏。
51.通过步骤s202至s208,获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;确定每组子进程对应的运行数据,得到多组运行数据;响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。也就是说,本公开实施例通过对游戏进程进行复制得到子进程,基于子进程对应的运行数据,确定目标运行数据,通过目标运行数据实现了提高对游戏状态进行复盘的效率的技术效果,解决了对游戏状态进行复盘的效率低的技术问题。
52.下面对本公开实施例的上述方法进行进一步介绍。
53.作为一种可选的实施例,获取战斗服务器中游戏进程的子进程,包括:调用分叉函数,在战斗服务器中复制游戏进程,得到子进程。
54.在该实施例中,可以通过调用分叉函数(fork)对战斗服务器中的游戏进程进行复制,得到子进程,比如,可以在当前时刻调用分叉函数,将当前时刻的游戏进程复制至另一战斗服务器中,得到子进程,从而完成对当前时刻游戏进程的复制。
55.可选地,可以预先设定需要获取子进程的时刻,当时间为预设的时刻时,可以调用分叉函数,在战斗服务器中复制游戏进程,得到子进程,比如,可以预设分别在5:00,5:30,6:00,6:20获取子进程,则当时间到达5:00,5:30,6:00,6:20中任意一个时刻时,调用分叉函数,对战斗服务器中的游戏进程进行复制,得到子进程。
56.作为一种可选的实施例,每隔目标时间周期,对分叉函数进行调用。
57.在该实施例中,可以根据实际情况,预设目标时间周期,每隔目标时间周期对分叉函数进行调用,其中,目标时间周期可以为根据实际情况预设的目标时间周期,比如,目标时间周期可以为一天、一小时、5-10秒等。
58.可选地,可以在战斗服务器中部署循环定时器,利用循环定时器,实现每隔目标时间周期,对分叉函数进行调用,从而可以控制在战斗服务器中对游戏进程进行复制的时间。
59.举例而言,当游戏开始的时候,可以启动部署于战斗服务器中的循环定时器,当循环定时器的时间到期时,可以调用战斗服务器中的分叉函数,对游戏进程进行复制,得到子进程。
60.再举例而言,已知游戏在晚上7:00~9:00的时间段之间容易出现掉线等问题,则可以在晚上7:00~9:00的时间段设置时间较短的目标时间周期,在其他时间段设置时间较长的目标时间周期,在每个目标时间周期对分叉函数进行调用,从而实现可以保存不同时刻的子进程,且可以根据实际情况选择保存子进程的频率。
61.由上述可知,循环定时器的时间间隔越短,可恢复的时刻的精度就越高,但同时,也会产生大量的子进程需要进行存储,从而会给服务器带来巨大的压力,但是在本公开实施例中,由于是对游戏进程进行复制,得到子进程,因此也可以选择想要存储的子进程的位置,也可以最大限度的对子进程进行存储。
62.作为一种可选的实施例,每隔目标时间周期,响应于停止请求,停止运行子进程。
63.在该实施例中,可以每隔目标时间周期,调用战斗服务器中的分叉函数,生成游戏进程的子进程,并立即调用游戏的停止请求,响应于停止请求,将子进程定格在当前时刻,以实现停止运行子进程,其中,停止请求可以为暂停指令,可以用于停止子进程继续运行。
64.举例而言,当循环定时器的时间到期时,可以调用战斗服务器中的分叉函数,生成战斗服务器进行的子进程,并立即调用游戏的暂停指令,将游戏状态定格在当前时刻。
65.作为一种可选的实施例,确定每组子进程对应的运行数据,包括:分别对每组子进程进行序列化处理,得到每组子进程对应的运行数据。
66.在该实施例中,为了将子进程转化为可以运输和使用(比如,标记)的数据,可以对子进程进行序列化处理,得到可以运输和使用的运行数据,可选地,对不同时刻的游戏进程进行复制,得到多组子进程,可以分别对每组子进程进行序列化处理,得到每组子进程的运行数据。
67.可选地,可以利用序列化模块中的持久化(dill)模块对子进程进行序列化处理,得到每组子进程对应的运行数据,其中,序列化处理可以包括通过定义接口的方法对数据进行序列化处理、通过定义接收方法(__reduce__方法)对数据进行序列化处理等,此处不对序列化处理的方式做具体限制,将子进程转换为可保持或可传输的运行数据的方法都应该在本公开的保护范围之内。
68.举例而言,可以利用注册序列化(copy_reg)获取函数和对象创建函数,当dill模块遇到不可序列化的对象时,可以查找copy_reg注册过的方法是否存在该对象类型,如果存在,则调用注册的数据读取方法读取子进程,完成对子进程数据的序列化。
69.虽然对进程进行序列化需要执行较长的时间,但是由于此时所处在分叉函数的子进程中,因此,本发明实施例可以允许序列化执行较长的时间,从而可以提高对数据存储的
准确性。
70.作为一种可选的实施例,将多组运行数据分别存储至多组数据库中;基于每组数据库中存储的运行数据的停止时刻和游戏中战斗名称,分别确定每组数据库的数据库名称,其中,所述战斗名称用于表征游戏中的战斗场次。
71.在该实施例中,对子进程进行处理,得到子进程的运输数据,得到多组运行数据,可以分别将每组运行数据存储至数据库中,可以将数据库中存储的运行数据的停止时刻和对应的战斗名称二者组合,得到数据库的名称,其中,数据库可以为本地缓存文件中,也可以为存储数据库等,可以用于存储的数据库都应在本公开的保护范围之内,战斗名称可以为战斗信息(战斗id),可以用于表征是那一场战斗,比如,可以为游戏的战斗场次。
72.可选地,将运行数据存储至数据库中,使用运行数据停止的停止时刻和战斗名称两者组合的结果作为数据库的命名(key)。
73.举例而言,获取子进程对应的运行数据(序列化数据),可以将序列化数据写入本数据库中,上传到数据库可以进行持久化存储,同时,上传至服务器中的数据可以根据战斗名称和游戏所处的时刻命名,从而方便后期在分布式服务器环境中快速确定需要复盘的运行数据。
74.作为一种可选的实施例,响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据,包括:基于游戏运行请求中的停止时刻、游戏运行请求中的战斗名称和数据库名称,从多组数据库中确定与游戏运行请求匹配的数据库,得到目标数据库;将目标数据库中存储的运行数据确定为目标运行数据。
75.在该实施例中,获取客户端发送的游戏运行请求,确定需要对游戏进行复盘,响应于客户端发送的游戏运行请求,基于获取到的游戏运行请求中的停止时刻、游戏运行请求中的战斗名称,从多个数据库中确定目标数据库,目标数据库中的数据可以为目标运行数据,对目标运行数据进行处理,得到游戏中虚拟对象的运行状态。
76.可选地,拿到子进程对应的运行数据后,可以将运行数据写入数据库中,可以根据战斗名称和游戏所处的时刻命名对服务器进行命名,由于停止时刻和战斗名称不可能都一致,因此每个服务器的名称都是不同的,因此,可以基于游戏运行请求快速从多个数据库中确定目标数据库,从而得到目标运行数据。
77.作为一种可选的实施例,基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态,包括:对目标运行数据进行反序列化处理,得到游戏的还原数据;基于还原数据确定运行状态。
78.在该实施例中,可以从目标数据库中获取目标运行数据,对目标运行数据进行反序列化处理,得到游戏的还原数据,运行还原数据,从而确定游戏中虚拟对象在目标时刻的运行状态。
79.可选地,可以从目标数据库中获取目标运行数据,但此时目标运行数据为经过序列化处理之后的序列化数据,因此,需要对目标运行数据进行反序列化处理,得到可以运行的数据,从而可以基于经过反序列化处理的还原数据确定虚拟对象在目标时刻的运行状态。
80.在本公开实施例中,通过对游戏进程进行复制得到子进程,基于子进程对应的运行数据,确定目标运行数据,通过目标运行数据实现了提高对游戏状态进行复盘的效率的
技术效果,解决了对游戏状态进行复盘的效率低的技术问题。
81.下面结合优选的实施方式对本公开实施例的技术方案进行进一步的举例介绍。具体以一种基于计算机编程语言(python)服务器的游戏复盘方法进行说明。
82.多人在线战术竞技游戏逐步开始发展起来,但针对选手掉线问题,由于存在技术原因导致游戏无法进行重连,在游戏比赛过程中,通常在打完一场重要团战后,都会暂停存储一下,以防止由于选手掉线、死机、断网等意外情况导致比赛被迫中断后,比赛需要重开的问题,影响比赛公平性。
83.随着网络游戏技术的进步,网页版游戏通常都支持断线重连功能,因此对于存储的需求也逐步下降,但仍然存在一些小概率的游戏故障(比如,bug)不仅会对比赛造成不公平的影响,甚至可能会逆转比赛结果,比如,存在一些严重程序故障导致比赛重新开始的情况,游戏重新开始严重影响了玩家心态,甚至导致比赛结果的改变,同时,重新开始比赛会进行游戏战场的重建,玩家出生点等各种随机因素都会影响比赛结果,为更好的解决上述问题,提出了通过游戏回溯或游戏复盘实现让战斗回溯到出现故障前的某一时刻,所有玩家重新连入这一时刻的战斗场景,从此时刻继续比赛,从而可以保留比赛优势方前期积累的优势。
84.竞技类网络游戏的主要同步方式可以包括:帧同步和状态同步。
85.图3是根据相关技术其中一实施例的帧同步的示意图,如图3所示,针对帧同步的游戏而言,客户端一、客户端二和客户端三定时通过上传指令实现将本帧上传至服务器(server)中,服务器通过下发指令,按照帧下发操作给所有客户端,客户端拿到操作后,驱动逻辑与表现状态机向前步进,比如,启动状态(start state),通过指令1将状态传递至状态一(state1),依次类推,直到将指令n传递至状态n(staten)。
86.可选地,帧同步的基本原理是,相同的起始状态加上相同的输入指令,可以得到相同的游戏状态,由此可知,帧同步的复盘方式往往比较简单,服务器只需要记录游戏的起始状态(比如,可以为一些随机数种子,场景配置,战斗配置等相关信息),并记录客户端每帧发来的操作,当需要复盘时,选定一个复盘时刻,将该时刻之前的操作帧一次性下发给客户端,客户端逐帧快速执行每帧逻辑,将游戏状态快速驱动到状态n的位置即可。
87.由上述可知,利用帧同步的同步机制,可以自动的进行游戏复盘,因此,几乎所有帧同步游戏都采用类似的方式实现,但是帧同步无法实现将相同的起始状态和相同的输入得到相同的结果状态,存在对游戏进行复盘的效率低的技术问题。
88.图4是根据相关技术其中一实施例的状态同步的示意图,如图4所示,状态同步的过程中,客户端一、客户端二和客户端三发出上传指令到服务器(serve),由于游戏的逻辑状态机在服务器,因此大多数逻辑判断是在服务器中执行,服务器根据客户端上传的上传指令驱动逻辑状态机步进,服务器只需要处理逻辑状态机,服务器下发状态变化给客户端,客户端根据状态变化,驱动客户端表现。
89.针对于状态同步而言,复盘的核心思路是将服务器状态复盘到某一时刻,然后客户端执行断线重连即可,当需要复盘时,可以根据记录的本场初始状态和客户端指令数据,驱动服务器逻辑状态机步进到某个状态停止,从而完成将服务器状态复盘到某时刻;或者可以在游戏进行的过程中,记录服务器中每个状态的全量状态数据,然后通过数据来直接恢复某个时刻的状态,但是,状态同步的同步机制本身并不支持复盘,甚至大部分游戏由于
其基础架构设计的限制,或实现语言特性等原因,状态同步的实现较为困难或无法实现。
90.对于很多状态同步游戏,接收输入和状态的同步往往封装的不好或者说没必要进行严密封装,因此在同步架构本身上无法做到像帧同步一样的按帧输入输出,同时游戏逻辑采用的时间也往往是真实时间而不是相对时间(通常用于计算一个时间段,用于逻辑计算或启动定时器),这些机制的不支持几乎无法做到像帧同步一样的从头驱动状态机达到某个状态,而为了实现这一功能,便需要极大代价对这些底层机制进行修改和支持,并需要大量测试保证功能稳定性。
91.对于状态同步,另一种思路是记录状态的全量状态数据的方式。不同于上述状态驱动的复盘方法对于游戏底层机制的诸多特殊要求,这一方式基本上没有什么特别的底层机制要求,因此也是绝大多数状态同步可以考虑的一种方式,但对于一个复杂的竞技类游戏来说,一场战斗在服务器的状态往往异常复杂,一个状态下的状态数据也非常大,各个对象之间的引用关系也非常复杂,想要完成数据的读取和恢复,依靠人力来完成对于后期的维护成本来说非常大,每开发新功能需要开发人员考虑到复盘功能并添加相应的复盘代码,在没有充分的测试的情况下,同样难以保证复盘结果的有效性,因此,这种方法在后期维护的时候需要更大的运行成本,而现阶段的网络游戏往往更新频率很快,在如此快速的游戏更新速度下,采用这种方法无论对开发还是测试来说,都将成为极大的负担,且读取全量状态需要递归整个战斗对象,往往需要大量的时间,由于在线程中读取某一时刻状态的同时,主线程的状态也需要不停的推进,因此,一些逻辑单线程的游戏无法在主线程插入状态存盘的逻辑,而放在线程中执行又无法读取到某一个时刻的完整状态。
92.综上所述,状态同步游戏的复盘功能往往实现十分困难,主要和状态同步的同步机制直接相关,且状态同步的项目在开发初期往往并不会考虑这些辅助功能,也不会针对这些功能专门制定特殊的开发规范,当项目进入运营期并发现需要提供此类功能时,实现代价又会变得十分巨大。
93.为解决上述问题,本公开实施例提出利用分叉函数(fork)的复制编写(copy-on-write)机制,复刻某一时刻的游戏状态得到子进程,然后在子进程中,利用游戏暂停机制暂停游戏状态,同时,利用计算机语言(python)的对象序列化(pickle)机制,将进程内的战斗对象序列化到文件内,并在文件内标记本对象所属的战斗名称(战斗id)和所处时刻,当需要复盘时,选择某个服务器的战斗进程,拉取文件数据,加载出本场战斗对象,通过主动修改参与本场战斗的玩家的内存数据状态,促使玩家客户端重登录后,可以自动重连到恢复的该场战斗内,从而实现了提高对游戏状态进行复盘的效率的技术效果,解决了对游戏状态进行复盘的效率低的技术问题。
94.下面对以战斗游戏为例对本公开实施例进行进一步介绍。
95.图5是根据本公开其中一实施例的游戏复盘的流程图,如图5所示,对游戏进行复盘可以包括以下几步。
96.步骤s501,启动循环定时器。
97.在该实施例中,当战斗游戏开始时,可以启动部署于战斗服务器中的循环定时器。
98.可选地,图6是根据本公开其中一实施例的游戏数据逻辑执行的示意图,如图6所示,游戏服务器可以分为游戏服务器(可以简称为游戏服),战斗服务器(可以简称为战斗服),玩家的数据逻辑在游戏服中执行,玩家未加入战斗前,客户端一只与游戏服一建立连
接,客户端二只与游戏服二建立连接,玩家加入战斗后,将所属同一场战斗的玩家加入到同一个战斗服内,客户端一随后与战斗服三建立另一条新连接,客户端二也与战斗服三建立新连接,从而使同一场战斗的不同玩家在战斗服三中处于同一进程,但在游戏服内可能处于不同进程。
99.步骤s502,调用分叉函数。
100.在该实施例中,当循环定时器的时间到期时,可以调用战斗服务器中的分叉函数,生成战斗服务器进行的子进程,并立即调用游戏的暂停指令,将游戏状态定格在当前时刻。
101.步骤s503,序列化子进程。
102.在该实施例中,可以利用序列化模块中的持久化(dill)模块,从而完成对python内置对象的序列化。
103.可选地,虽然对python内置对象的序列化需要执行较长的时间,但是由于此时所处在分叉函数的子进程中,可以允许序列化执行较长的时间。
104.在该实施例中,可以利用dill模块,对子进程进行序列化操作,将子进程中的数据(比如,虚拟对象状态)转化为可保持或传输的格式的过程,以实现数据传输的目的。
105.对于纯python编写的代码,往往可以直接生成序列化的数据,但游戏服为了效率问题,会将一些业务逻辑代码进行重写,重写为用户自定义的代码(比如,c 代码),然后导出到python中供游戏使用,图7是根据本公开其中一实施例的战斗树引用关系的示意图,如图7所示,对于一个房间对象(room)进行序列化,房间对象可以用于表征战斗的场次;房间对象可以包括:玩家管理器(avatardict)、碰撞管理器(collisionmgr)和战斗对象管理器(unitmgr)和无法序列化的数据(比如,logger、pos:math3d.vector)等,图7中包含的东西仅为举例说明,不做房间对象中的内容做具体限制。
106.可选地,玩家对象可以包括玩家管理器一(avatarsoul)和玩家管理器二(avatarsoul);碰撞管理器(collisionmgr)可以用于管理碰撞对象管理器(scene_col),碰撞对象管理器可以包括碰撞对象一(col_object)和碰撞对象二(col_object);战斗对象管理器(unitmgr)可以包括**战斗对象一(**unit)和**战斗对象二(**unit)。
107.在图7中,斜线方格可以用于表征c 模块对象,因此,需要解决斜线方格中引用的c 模块对象的序列化问题,图7中每个方格可以表示战斗的过程中使用的战斗对象,可以根据实际战斗过程中的引用关系确定战斗树的引用关系图。
108.如图7所示,组件树中会存在python对象引用的c 对象,对于纯c 对象来说,存在dill模块无法处理该部分逻辑的问题,为解决上述问题,需要对c 代码进行针对性处理,比如,可以通过选择适配的序列化方法,使得dill模块能够识别并将这部分对象进行正确的序列化。
109.举例而言,可以通过定义接口的方法对数据进行序列化,对于继承自c 对象的python对象,可以由dill模块在类中自定义状态(__getstate_)和设置状态(__setstate_)序列化的接口,在序列化对象时,如果对象存在__getstate__方法,在序列化时可以调用__getstate__获取数据,在反序列化时可以调用__setstate__传入该数据并恢复工作状态,其中,反序列化可以用于表征游戏的恢复过程。
110.再举例而言,可以通过定义接收方法(__reduce__方法)对数据进行序列化,__reduce__方法会比__getstate__更加灵活,__reduce__方法合并了__getstate__和__
setstate__的功能,可以通过定义__reduce__方法返回一个五元组,通过该五元组确定反序列化时如何创建游戏中的虚拟对象,使用__reduce__方法还可以将一个虚拟对象序列化后反序列化出另一个类型的虚拟对象。
111.作为一种可选的实例,对于使用c 编写的扩展类创建的特殊对象,由于这类对象是自定义的c扩展类,可以直接在c 中通过上述自定义方法并导出,针对特定的类可以利用特定的方法进行处理。
112.作为另一种可选的实例,可以利用注册序列化(copy_reg)获取函数和对象创建函数,当dill模块遇到不可序列化的对象时,可以查找copy_reg注册过的方法是否存在该对象类型,如果存在则调用注册的数据读取方法读取对象数据,同样的,可以根据注册的对象创建方法来恢复对象,完成反序列化的过程。
113.作为另一种可选的实例,可以通过python类继承该c 类,脚本创建的实例对象使用python继承的类来创建,不直接通过扩展库中的c 类创建。如此,可以在继承的类中使用__getstate__和__setstate__来读取和恢复对象。
114.需要说明的是,无论是使用继承,还是使用copy_reg注册序列化方式,解决c 对象问题的本质是为c 对象额外添加python层封装,除了一些简单的引用c 对象的情况外,可能还存在一些特殊情况,对于c 对象直接引用c 对象的情况,可以通过在python层继承,然后在python层额外附加一层python引用关系,来帮助dill模块在序列化时找到隐藏在c 对象内的对象引用关系,同时通过一些特殊的hook写法,在对象恢复时,利用对象数据重建c 对象并恢复c 对象内的引用关系,上述序列化的方式仅为举例说明,此处不对序列化的方法做具体限制。
115.步骤s504,对序列化数据进行命名。
116.在该实施例中,拿到子进程对应的序列化数据后,可以将序列化数据写入本地文件(比如,缓存)或数据库中,上传到数据库可以进行持久化,同时,方便后期在分布式服务器环境中重建复盘游戏对象(战斗对象),上传至服务器中的数据可以根据战斗名称(战斗id)和游戏所处的时刻命名。
117.步骤s505,获取游戏复盘请求。
118.在该实施例中,当需要复盘时,可以利用游戏运营指令,输入需要复盘的战斗名称和需要复盘的时刻,获取游戏复盘请求,将游戏复盘请求发送到某一战斗服上,可以根据游戏运营指令中的时刻向前找到最靠近该时刻的录像存档时刻,生成指令(key),并从数据库中下载该时刻对应的数据,可以通过反序列化恢复虚拟对象的运行状态。
119.步骤s506,同步战场信息给所有参与玩家。
120.在该实施例中,可以将与战斗相关的信息,比如,战斗id,战斗所处的战斗服地址,同步给参与本场战斗的所有玩家和所处游戏服务器进程内的对应的虚拟对象(avatar),更新虚拟对象的状态为战斗中状态。
121.可选地,可以通知玩家重新登陆,重新登录的时候可以检测虚拟对象状态为战斗中,通过之前同步的战斗id和所处的战斗服地址,即可连入战斗,连入战斗后,战斗处于暂停状态,玩家手动结束暂停可继续进行游戏。
122.本公开实施例利用分叉函数的copy_on_write机制,使父进程的内存状态可以全部复制到子进程,即使父进程所在战斗服继续进行,子进程的状态仍能保留在分叉函数调
用时刻的状态,同时子进程的其他执行逻辑不会影响父进程的运行,从而达到了将战斗状态快速回溯到距离目标点较近的时间点上的目的;利用pickle机制,仅读取对象属性值,从而实现只是从底层的角度读取战场状态,避免在业务中安插过多状态读取和状态恢复的代码,极大的减少后期的维护和测试成本,降低复盘功能可能带来的异常风险。
123.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本公开各个实施例所述的方法。
124.在本实施例中还提供了一种数据处理装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“单元”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
125.图8是根据本公开实施例的一种数据处理装置的结构框图,如图8所示,该数据处理装置可以包括:获取单元802、第一确定单元804、第二确定单元806和第三确定单元808。
126.获取单元802,用于获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;
127.第一确定单元804,用于确定每组子进程对应的运行数据,得到多组运行数据;
128.第二确定单元806,用于响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;
129.第三确定单元808,用于基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。
130.在该实施例中,通过获取单元获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;通过第一确定单元确定每组子进程对应的运行数据,得到多组运行数据;通过第二确定单元响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;通过第三确定单元基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态,从而实现了提高对游戏状态进行复盘的效率的技术效果,解决了对游戏状态进行复盘的效率低的技术问题。
131.需要说明的是,上述各个单元是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述单元均位于同一处理器中;或者,上述各个单元以任意组合的形式分别位于不同的处理器中。
132.本公开的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
133.可选地,在本实施例中,上述非易失性存储介质可以被设置为存储用于执行以下步骤的计算机程序:
134.s1,获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;
135.s2,确定每组子进程对应的运行数据,得到多组运行数据;
136.s3,响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;
137.s4,基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。
138.可选地,在本实施例中,上述计算机可读存储介质可以包括但不限于:u盘、只读存储器(read-only memory,简称为rom)、随机存取存储器(random access memory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
139.本公开的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
140.可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
141.可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:
142.s1,获取战斗服务器中游戏进程的多组子进程,其中,游戏进程用于表征游戏进行的过程,游戏进程包括子进程;
143.s2,确定每组子进程对应的运行数据,得到多组运行数据;
144.s3,响应于客户端发送的游戏运行请求,从多组运行数据中确定与游戏运行请求对应的目标运行数据;
145.s4,基于目标运行数据,确定游戏中虚拟对象在目标时刻的运行状态。
146.可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
147.图9是根据本公开实施例的一种电子装置的示意图。如图9所示,电子装置900仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
148.如图9所示,电子装置900以通用计算设备的形式表现。电子装置900的组件可以包括但不限于:上述至少一个处理器910、上述至少一个存储器920、连接不同系统组件(包括存储器920和处理器910)的总线930和显示器940。
149.其中,上述存储器920存储有程序代码,所述程序代码可以被处理器910执行,使得处理器910执行本技术实施例的上述方法部分中描述的根据本发明各种示例性实施方式的步骤。
150.存储器920可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(ram)9201和/或高速缓存存储单元9202,还可以进一步包括只读存储单元(rom)9203,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。
151.在一些实例中,存储器920还可以包括具有一组(至少一个)程序模块9205的程序/实用工具9204,这样的程序模块9205包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。存储器920可进一步包括相对于处理器910远程设置的存储器,这些远程存储器可以通过网络连接至电子装置900。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
152.总线930可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理器910或者使用多种总线结构中的任意总线结构的局域总线。
153.显示器940可以例如触摸屏式的液晶显示器(lcd),该液晶显示器可使得用户能够与电子装置900的用户界面进行交互。
154.可选地,电子装置900也可以与一个或多个外部设备1400(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子装置900交互的设备通信,和/或与使得该电子装置900能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口950进行。并且,电子装置900还可以通过网络适配器960与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图9所示,网络适配器960通过总线930与电子装置900的其它模块通信。应当明白,尽管图9中未示出,可以结合电子装置900使用其它硬件和/或软件模块,可以包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。
155.上述电子装置900还可以包括:键盘、光标控制设备(如鼠标)、输入/输出接口(i/o接口)、网络接口、电源和/或相机。
156.本领域普通技术人员可以理解,图9所示的结构仅为示意,其并不对上述电子装置的结构造成限定。例如,电子装置900还可包括比图9中所示更多或者更少的组件,或者具有与图1所示不同的配置。存储器920可用于存储计算机程序及对应的数据,如本公开实施例中的数据处理方法对应的计算机程序及对应的数据。处理器910通过运行存储在存储器920内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的数据处理方法。
157.上述本公开实施例序号仅仅为了描述,不代表实施例的优劣。
158.在本公开的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
159.在本公开所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
160.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
161.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
162.所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式
体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
163.以上所述仅是本公开的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本公开原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本公开的保护范围。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献