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

数据同步方法及装置与流程

2021-12-04 02:20:00 来源:中国专利 TAG:


1.本技术涉及数据处理技术领域,尤其涉及一种数据同步方法及装置。


背景技术:

2.在多端交互的应用场景中,需要进行指令同步。例如,在游戏应用场景中,游戏服务端需要与多个用户客户端之间进行指令同步;再如,在教学应用场景中,教师终端需要与多个学生终端之间进行指令同步。
3.目前所采用的锁帧同步方案中,在服务器将指令发送给各个客户端之后,需要等待每个客户端回复指令执行完成的消息,才能进行下一指令的同步,因此,可能会因为个别客户端的消息回复延迟而导致所有客户端卡顿的情况。而为了避免这种卡顿,多采用服务器驱动所有客户端播帧的方案,即:服务端按照一定的频率向所有客户端发送指令。
4.但是这种播帧的方案会导致服务端和客户端之间的传输数据量较高。


技术实现要素:

5.有鉴于此,本技术提供一种数据同步方法及装置,如下:
6.一种数据同步方法,应用于客户端,包括:
7.在至少两客户端通过一服务端建立通信的情况下,监测所述客户端上的待同步数据;
8.如果监测到所述至少两客户端中至少之一上存在待同步的操作数据,生成第一指令并通过所述服务端给到所述至少两客户端中的所有客户端,所述第一指令中至少包含所述操作数据;
9.如果监测到所述客户端上没有待同步的操作数据,执行监测所述客户端上的待同步数据的步骤。
10.上述方法,优选的,所述方法还包括:
11.在同步控制条件被满足的情况下,执行所述:监测所述客户端上的待同步数据;
12.其中,所述同步控制条件包括:从所述客户端与所述服务端开始同步的时刻起,所述客户端上生成的指令被执行完成且监测执行次数小于监测预定次数;所述监测执行次数为从所述客户端与所述服务端开始同步的时刻起,执行监测所述客户端上的待同步数据的历史次数;所述监测预定次数为从所述客户端与所述服务端开始同步的时刻起,所包含的预设间隔阈值的数量。
13.上述方法,优选的,在监测所述客户端上的待同步数据之前,所述方法还包括:
14.获得开始时刻;所述开始时刻为所述服务端与所述客户端开始同步的时刻;
15.根据当前时刻和所述开始时刻之间的时刻差值,获得间隔计数值;
16.使用所述当前时刻,更新所述开始时刻;
17.监测所述间隔计数值;
18.如果所述间隔计数值大于或等于所述间隔阈值对应的阈值计数值,执行所述监测
所述客户端上的待同步数据的步骤,并根据所述阈值计数值更新所述间隔计数值,再返回执行监测所述间隔计数值的步骤,直到所述间隔计数值小于所述阈值计数值;
19.在等待预设的休眠时长之后,返回执行根据当前时刻和所述开始时刻之间的时刻差值,获得间隔计数值的步骤。
20.上述方法,优选的,所述第一指令中还包含第一指令标识,所述客户端上配置有指令集合,所述指令集合用于存储所述服务端发送来的目标指令,所述目标指令的指令标识用于指示在所述指令集合中按照所述指令标识之间的顺序执行所述指令集合中的指令。
21.上述方法,优选的,所述方法还包括:
22.接收第二指令,所述第二指令中至少包含第二指令标识;
23.将所述第二指令添加到所述指令集合中;
24.在所述指令集合中,从所述第二指令标识开始,执行所述指令集合中的指令。
25.上述方法,优选的,所述方法还包括:
26.在监测到指令传输连接的断点的情况下,获得所述断点对应的断点标识;
27.根据所述断点标识,向所述服务端发送断点重传请求,以获得所述服务端发送的断点集合,所述断点集合中包含所述断点标识对应的历史指令和排序在所述断点标识之后的所有指令标识对应的历史指令;
28.将所述断点集合中的历史指令添加到所述指令集合中;
29.在所述指令集合中,从所述断点标识开始,执行所述指令集合中的指令。
30.上述方法,优选的,所述操作数据中至少包含对象参数和操作参数,所述操作数据用于指示执行所述对象参数对应的目标对象按照所述操作参数执行相应的操作。
31.上述方法,优选的,所述操作参数对应的被处理数据为定点数类型的数据。
32.一种数据同步方法,应用于服务端,所述方法包括:
33.在与至少两个客户端建立通信的情况下,监测来自所述客户端的指令;
34.如果获得来自所述至少两个客户端中至少之一的第一指令,所述第一指令中包含有操作数据,将所述第一指令给到所述至少两个客户端中的所有客户端,以使得所述客户端根据所述操作数据执行相应处理;
35.如果没有获得来自所述客户端的指令,返回执行监测来自所述客户端的指令的步骤。
36.一种数据同步装置,应用于客户端,所述装置包括:
37.数据监测单元,用于在至少两客户端通过一服务端建立通信的情况下,监测所述客户端上的待同步数据;如果监测到所述至少两客户端中至少之一上存在待同步的操作数据,触发指令处理单元,如果监测到所述客户端上没有待同步的操作数据,继续监测所述客户端上的待同步数据;
38.指令处理单元,用于生成第一指令并通过所述服务端给到所述至少两客户端中的所有客户端,第一指令中至少包含所述操作数据。
39.一种数据同步装置,应用于服务端,所述装置包括:
40.指令监测单元,用于在与至少两个客户端建立通信的情况下,监测来自所述客户端的指令;如果获得来自所述至少两个客户端中至少之一的第一指令,所述第一指令中包含有操作数据,触发指令传输单元;如果没有获得来自所述客户端的指令,返回执行监测来
自所述客户端的指令的步骤;
41.指令传输单元,用于将所述第一指令给到所述至少两个客户端中的所有客户端,以使得所述客户端根据所述操作数据执行相应处理。
42.一种客户端,包括:
43.存储器,用于存储应用程序和应用程序运行所产生的数据;
44.处理器,用于执行应用程序,以实现:在至少两客户端通过一服务端建立通信的情况下,监测所述客户端上的待同步数据;如果监测到所述至少两客户端中至少之一上存在待同步的操作数据,生成第一指令并通过所述服务端给到所述至少两客户端中的所有客户端,第一指令中至少包含所述操作数据,如果监测到所述客户端上没有待同步的操作数据,继续监测所述客户端上的待同步数据。
45.一种服务端,包括:
46.存储器,用于存储应用程序和应用程序运行所产生的数据;
47.处理器,用于执行应用程序,以实现:在与至少两个客户端建立通信的情况下,监测来自所述客户端的指令,如果获得来自至少两个客户端中至少之一的第一指令,第一指令中包含有操作数据,将第一指令给到至少两个客户端中的所有客户端,以使得其他客户端根据操作数据执行相应处理,如果没有获得来自客户端的指令,继续监测来自所述客户端的指令。
48.一种存储介质,所述存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上任一项所述的数据同步方法。
49.从上述技术方案可以看出,本技术公开的一种数据同步方法及装置中,对于任一通过服务端建立通信的客户端,通过监测客户端上的待同步数据,进而在监测到存在待同步的操作数据的情况下,生成指令并通过服务端同步给到所有客户端,而如果监测到没有操作数据需要同步,则继续监测而无需发送指令给其他客户端,由此,在现操作数据同步的同时,能够减少服务端与客户端之间的传输数据量。
附图说明
50.为了更清楚地说明本技术实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
51.图1为本技术实施例一提供的一种数据同步方法的流程图;
52.图2为至少两客户端通过服务端建立通信的示意图;
53.图3为多客户端之间通过服务端进行同步的示意图;
54.图4为本技术实施例一提供的一种数据同步方法的另一流程图;
55.图5a和图5b分别为本技术实施例中同步控制条件判断的示例图;
56.图6为本技术实施例一提供的一种数据同步方法的另一流程图;
57.图7a为本技术实施例中进行指令同步的示例图;
58.图7b为本技术实施例一提供的一种数据同步方法的部分流程图;
59.图8为多个客户端之间通过服务端进行指令同步的示例图;
60.图9为本技术实施例中实现客户端上回滚的示例图;
61.图10为本技术实施例一提供的一种数据同步方法的另一部分流程图;
62.图11为本技术实施例中实现客户端上断点续传的示例图;
63.图12为本技术实施例二提供的一种数据同步方法的流程图;
64.图13为本技术实施例三提供的一种数据同步装置的结构示意图;
65.图14为本技术实施例四提供的一种数据同步装置的结构示意图;
66.图15为本技术实施例五提供的一种客户端的结构示意图;
67.图16为本技术实施例六提供的一种服务端的结构示意图;
68.图17

图21分别为本技术适用于游戏应用场景的示例图。
具体实施方式
69.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
70.参考图1所示,为本技术实施例一提供的一种数据同步方法的实现流程图,该方法可以适用于与其他客户端通过服务端建立通信的任一客户端上。如图2中所示,至少两个客户端通过一服务端建立通信,客户端可以为手机、pad、笔记本、计算机等电子设备,服务端可以为服务器等设备。客户端与服务端之间通过所建立的通信进行数据同步,具体可以为针对一个或多个被操作对象的数据同步,例如,游戏应用场景中各个用户客户端与游戏服务端之间同步各个角色的移动,再如,教学应用场景中各个学生终端与教师终端之间同步教学内容,等等。本实施例中的技术方案主要用于降低服务端与客户端之间的传输数据量。
71.具体的,本实施例中的方法可以包含如下步骤:
72.步骤101:在至少两客户端通过一服务端建立通信的情况下,监测客户端上的待同步数据,如果监测到所述至少两客户端中至少之一上存在待同步的操作数据,执行步骤102,如果监测到所述客户端上没有待同步的操作数据,继续执行步骤101,即继续监测客户端上的待同步数据。
73.其中,本实施例中的方案适用于图2所示的任一客户端上,因此,每个客户端上均执行本实施例中的方法。本实施例中以其中一个客户端为例进行说明。客户端与服务端之间可以通过无线网络建立通信,也可以通过有线网络建立通信。
74.具体的,本实施例中可以监测客户端上的被操作对象是否存在状态变化,如游戏的角色对象是否被移动,再如,教学内容中是否有内容书写,等等,在有被操作对象存在状态变化的情况下,可以确定客户端上存在待同步的操作数据。或者,本实施例中可以监测客户端上的输入设备是否存在输入操作,如键盘或摇杆等是否被用户进行操作,在输入设备存在输入操作的情况下,可以确定客户端上存在待同步的操作数据。这里的操作数据中可以包含有表征被操作对象的状态变化的参数数据例如,操作数据中至少包含对象参数和操作参数,操作参数用于指示执行对象参数对应的目标对象按照所述操作参数执行相应的操作。操作参数至少能够表征对目标对象进行操作的操作类型和操作方式等内容。对象参数可以为目标对象的对象标识,以此表征目标对象。
75.步骤102:生成第一指令并通过服务端给到至少两客户端中的所有客户端。
76.其中,第一指令中至少包含所述操作数据。
77.具体的,本实施例中可以在任一客户端上监测到待同步的操作数据之后,在客户端上通过与服务端之间建立的通信,将生成的第一指令传输给服务端,由服务端统一同步给所有客户端。例如,在某个监测到待同步的操作数据的第一客户端上,生成包含操作数据的第一指令之后,将第一指令通过第一客户端与服务端之间建立的通信发送给服务端,再由服务端通过第一客户端和第二客户端各自与服务端之间建立的通信发送给所有客户端,第二客户端指代区别于第一客户端的所有其他客户端,如图3中所示,由此实现操作数据在服务端和所有客户端之间的同步。
78.需要说明的是,第一指令中的操作数据所包含的操作参数对应有被处理数据,如游戏对象向左移动3厘米的数据、教学内容中增加一条横线的数据等,该被处理数据被转换为定点数类型的数据,例如,将传输给所有客户端的操作数据以定点数代替浮点float类型,由此避免客户端之间数据类型不同所导致的指令执行结果不一致的情况,例如,避免各个游戏客户端上控制游戏对象移动距离不同的情况。
79.由上述方案可知,本技术实施例一提供的一种数据同步方法中,对于任一通过服务端建立通信的客户端,通过监测客户端上的待同步数据,进而在监测到存在待同步的操作数据的情况下,生成指令并通过服务端同步给到所有客户端,而如果监测到没有操作数据需要同步,则继续监测而无需发送指令给其他客户端,由此,在现操作数据同步的同时,能够减少服务端与客户端之间的传输数据量。
80.在一种实现方式中,为了降低客户端上的功耗,避免频繁执行同步监测所引起的高功耗的情况,本实施例中为同步监测设置条件,具体如图4中所示:
81.步骤100:判断同步控制条件是否被满足,在同步控制条件被满足的情况下,执行步骤101,以监测客户端上的待同步数据,如果同步控制条件没有被满足,那么继续执行步骤100,而在同步控制条件被满足之后,也会继续执行步骤100,以持续对同步控制条件是否被满足进行判断。
82.其中,同步控制条件可以包括:从客户端与服务端开始同步的时刻起,在客户端上生成的指令被执行完成的情况下,监测执行次数小于监测预定次数。因此,从客户端与服务端开始同步的时刻起,各个客户端上持续对同步控制条件是否被满足进行判断,进而来确定监测客户端上的待同步数据的时机,以免持续监测待同步数据所造成的功耗过高以及数据量过大的情况。
83.这里的监测执行次数为从客户端与服务端开始同步的时刻起,执行监测客户端上的待同步数据的历史次数,即执行步骤101的次数;而监测预定次数为从客户端与服务端开始同步的时刻起,所包含的预设间隔阈值的数量,具体为包含的间隔阈值的个数的整数值。
84.需要说明的是,间隔阈值可以根据需求设置,如40毫秒或者50毫秒等。
85.也就是说,对于监测客户端是否有待同步数据的执行时机基于间隔阈值来确定,具体为:
86.通常情况下,每等待间隔时长,均执行一次步骤101,即监测一次客户端上是否存在待同步数据;
87.但是,由于并非每次监测都存在待同步的操作数据,也就是说并非每次监测都需
要生成指令给到其他客户端,因此:
88.在监测一次客户端是否存在待同步数据之后,如果本次监测到客户端上没有待同步的操作数据,那么等待间隔阈值对应的时长后,当前的客户端上可以再次执行一次待同步数据的监测,而如果本次监测到客户端上存在待同步的操作数据,那么客户端上除了生成指令给服务端之外,还可能会执行服务端发送来的指令,同样的,在本次监测到客户端上存在待同步的操作数据时,会等待间隔阈值对应的时长,如果在间隔阈值的时长到达时,客户端上的指令已经被执行完成,那么在当前的客户端上,同步控制条件被满足,此时再次监测客户端上是否存在待同步数据,如果在间隔阈值的时长到达时,客户端上的指令没有被执行完成,那么会继续等待直到指令被执行完成之后,再判断监测执行次数是否小于监测预定次数;如果监测执行次数小于监测预定次数,那么继续按照以上方式进行客户端与服务端之间的同步。
89.例如,如图5a中所示,从客户端与服务端之间开始同步的时刻起,初始状态下,监测执行次数和监测预定次数均为0,即没有执行过同步监测,所持续的同步时长也不超过间隔阈值,如40毫秒。随着时间的推进,各个客户端上各自进行对象操作,可能存在待同步数据,由此,在各个客户端上各自执行以下处理:随着时间的推进,各个客户端上的监测预定次数在等待间隔阈值的时长时加1,而监测执行次数仍然为0,此时,在各个客户端上执行监测是否存在待同步数据的步骤,即“监测1”,以第一客户端为例,如果监测到第一客户端上没有待同步的操作,那么第一客户端上继续等待,直到监测预定次数变化为2,此时,在第一客户端上再次执行监测是否存在待同步数据的步骤,即“监测2”;如果监测到第一客户端上存在待同步的操作数据,此时生成第一指令并给到服务端,如果此时第一客户端上执行服务端发送来的指令,那么在第一客户端上执行完成服务端发送来的指令的时候,对监测预定次数和监测执行次数之间的关系再次进行判断,如果服务端发来的指令在间隔阈值的时长到来时没有被执行完成,即指令的执行时长超过了间隔阈值的时长,如图5a中所示的60毫秒,那么在指令被执行完成之后,监测预定次数已经大于监测执行次数,此时,第一客户端上可以再次执行监测是否存在待同步数据的步骤,即“监测3”,如果没有监测到第一客户端上存在待同步的操作数,那么继续等待,直到监测预定次数大于监测执行次数,第一客户端上可以再次执行监测是否存在待同步数据的步骤,即“监测4”。当然,在第二次监测后如果服务端发来的指令在间隔阈值的时长到来时已经被执行完成,那么就继续等待,如图5b中所示,直到监测预定次数大于监测执行次数,第一客户端上可以再次执行监测是否存在待同步数据的步骤。参考以上逻辑,以此类推,在各个客户端上均执行以上监测方案,由此使得各个客户端上可以保证在一定的时长内所进行的同步次数是相似的,由此保证至少相近的同步频率。
90.具体的,本实施例中在可以按照以下流程,实现同步频率的控制,也就是说,在步骤101中监测所述客户端上的待同步数据之前,步骤100可以通过以下方式实现,如图6中所示:
91.步骤601:获得开始时刻。
92.其中,初始状态下,开始时刻为服务端与客户端开始同步的时刻。
93.步骤602:根据当前时刻和开始时刻之间的时刻差值,获得间隔计数值。
94.其中,当前时刻是指客户端上的时钟当前所记录的时刻。具体的,本实施例中可以
使用当前时刻减去开始时刻所得到的时长,乘以单位计数值ticks,由此得到间隔计数值。例如,这里的单位计数值是指时间流逝的最小单位数值如10000或其他数值,由此提高本实施例中通过代码执行时的精度,进而实现更准确的同步效果。
95.步骤603:使用当前时刻,更新开始时刻。
96.例如,将当前时刻的时刻值赋值给开始时刻,由开始时刻这一变量记录当前时刻。
97.步骤604:监测间隔计数值是否大于或等于间隔阈值对应的阈值计数值,如果间隔计数值大于或等于阈值计数值,执行步骤101,以监测客户端上的待同步数据,并执行步骤605。
98.步骤605:根据阈值计数值更新间隔计数值,再返回执行步骤604,以监测间隔计数值,直到间隔计数值小于阈值计数值,执行步骤606。
99.其中,可以将间隔计数值减去阈值计数值所得到的差值赋值给间隔计数值。而间隔阈值对应的阈值计数值是指:将间隔阈值乘以单位计数值ticks,由此得到阈值计数值。
100.步骤606:等待预设的休眠时长,之后,返回执行步骤602以及后续步骤,而步骤602中是根据当前时刻和被更新的开始时刻之间的时刻差值,获得间隔计数值。
101.具体实现中可以如下所示的循环执行伪代码:
102.[0103][0104]
在一种实现方式中,第一指令中还包含第一指令标识,该第一指令标识为客户端在生成第一指令时为第一指令所设置的指令标识,在各个客户端上维护自己的指令标识。另外,各个客户端上均配置有指令集合,每个客户端上的指令集合各自用于存储服务端发送来的目标指令。指令集合中各个目标指令均具有各自的指令标识,目标指令的指令标识用于指示在指令集合中按照指令标识之间的顺序执行指令集合中的目标指令。
[0105]
其中,指令标识可以为表征指令的执行顺序的编号或编码,例如,可以用数字表示指令的编号,由此,在各个客户端上按照指令编号之间数字的大小关系执行指令集合中的指令。需要说明的是,各个客户端上的指令集合中的目标指令的指令标识由服务端接收到各个客户端同步来的指令后进行设置。具体的,服务端上每间隔预设的间隔阈值的时长对所维护的指令标识进行增加1个顺序,服务端上在接收到各个客户端上发送来的指令后,按照服务端上的当前指令标识为当前接收到的指令设置指令标识,之后,服务端再将这些目标指令发送给各个客户端,由此,各个客户端上将接收到的服务端发送来的目标指令添加到指令集合中。
[0106]
例如,服务端每个40毫秒为自己维护的指令编号加1,在指令编号被累加到3时,服务端接收到客户端1发送的编号为1的指令、客户端2发送的编号为1的指令和编号为2的指令,此时,服务端将客户端1发送的编号为1的指令、客户端2发送的编号为1的指令和编号为2的指令的指令编号均设置为3,之后,服务端将这三个指令编号为3的指令发送到所有客户端,如图7a中所示。
[0107]
具体实现中,客户端上所维护的指令标识在每执行一次监测客户端上的待同步数据时增加一个顺序,例如,指令编号在客户端每执行一次待同步数据的监测步骤就加1,在客户端上监测到存在待同步的操作数据并生成第一指令时,将当前被加1的指令编号给到第一指令,成为第一指令的指令标识,如果客户端上监测到没有待同步的操作数据,那么指令编号仍然会被加1,也就是说,各个客户端上分别维护一个指令编号,在每监测一次客户端上待同步数据时,对指令编号加1,如果生成有相应的第一指令,那么赋值给第一指令,同时,在服务端上也维护一个指令编号,在每隔间隔阈值的时长服务端上的指令编号被加1,服务端上的指令编号用于为接收到的指令添加指令标识。因此,虽然执行监测步骤的具体时刻存在毫秒上的误差,但是通过在各个客户端和服务端上均执行以上监测方案和指令编号的处理方案,使得各个客户端上可以保证在一定的时长内所进行的同步次数是相似的,而且,在各个客户端上同步到所有客户端同步来的指令之后,可以按照服务端重新添加的指令编号所表征的顺序进行指令执行,由此在保证至少相近的同步频率的同时,实现操作
数据的准确同步。
[0108]
基于以上实现,在各个客户端上接收到通过服务端同步来的第二指令时,可以通过以下方式进行指令回滚的执行,如图7b中所示:
[0109]
步骤701:接收第二指令。
[0110]
其中,第二指令中至少包含第二指令标识,当然还包含有发送给第二指令的客户端上待同步的操作数据,第二指令标识由服务端按照接收到该第二指令时自己所维护的当前指令标识进行设置。
[0111]
步骤702:将第二指令添加到指令集合中。
[0112]
具体的,本实施例中是将第二指令添加到当前的客户端的指令集合中。由此,在当前的客户端的指令集合中包含所有客户端通过服务端所同步来的目标指令,指令集合中的目标指令均具有自己的指令标识,因此,可能存在多个指令的指令标识相同的情况。例如,如图8中所示,以游戏客户端和游戏服务端为例,客户端1生成编号为1的指令和编号为2的指令并发送给服务端,服务端在自己的编号为3时接收到这两个指令并将这两个指令的编号设置为3;客户端2生成编号为2的指令并发送给服务端服务端在自己的编号为4时接收到这个指令并将这个指令的编号设置为4;客户端3生成编号为1的指令和编号为4的指令并发送给服务端,服务端在自己的编号为2时接收到客户端3发送的编号为1的指令并将该指令的编号设置为2,服务端在自己的编号为5时,接收到客户端3发送的编号为4的指令并将该指令的编号设置为5,在经过服务端同步之后,在客户端1、客户端2和客户端3各自的指令集合中分别包含有:一个编号为2的指令、两个编号为3的指令、一个编号为4的指令和一个编号为5的指令。
[0113]
步骤703:在指令集合中,从第二指令标识开始,执行指令集合中的指令。
[0114]
其中,由于客户端与服务端之间的传输延迟,服务端传输来的第二指令的指令标识可能会在当前的客户端上的当前指令标识之前,因此,在当前的客户端上接收到服务端同步来的第二指令之后,将第二指令添加到当前的客户端的指令集合中,并在客户端上的应用运行状态回滚到第二指令的指令标识对应的时刻之前的状态,以便于从新加入的第二指令开始执行在第二指令标识之后的所有指令标识对应的指令,实现指令的回滚执行。
[0115]
例如,如图9中所示,以客户端1为例,客户端1的指令集合中当前包含有:一个编号为2的指令、两个编号为3的指令、一个编号为4的指令和一个编号为5的指令,基于此,由于客户端2与服务端之间的传输速率较慢,导致服务端同步来的编号为4的新指令在客户端1上的指令编号为5时才被传输到客户端1上,客户端1上在将服务端同步来的编号为4的新指令添加到客户端1的指令集合中之后,先将客户端1上的游戏应用的场景状态恢复到客户端1上的编号为4时之前的状态,如将游戏对象从当前位置恢复到80毫秒之前的位置上,之后,再从编号为4开始,依次执行指令集合中的后续指令,即:虽然客户端1上已经执行到编号为5的指令,但也会从编号4的指令重新开始依次执行:两个编号为4的指令和编号为5的指令,由此实现指令回滚,因此,各个游戏玩家可以在各自的游戏客户端上通过画面回滚观看到其他游戏玩家的完整动作。
[0116]
另外,在各个客户端上如果存在与服务端之间的通信断开而无法接收到其他客户端通过服务端同步来的指令时,可以通过以下方式进行断点续传的执行,如图10中所示:
[0117]
步骤1001:监测是否存在指令传输连接的断点,如果监测到指令传输连接的断点,
执行步骤1002,如果没有监测到断点,那么继续执行步骤1001,以持续监测断点是否存在。
[0118]
其中,指令传输连接可以理解为当前的客户端与服务端之间的通信连接,而断点是指通信连接断开后导致指令无法传输的状态节点。
[0119]
具体的,本实施例中可以对当前的客户端与服务端之间的通信状态进行监测,进而在通信发生断开的情况下,监测到指令传输连接的断点。
[0120]
步骤1002:获得断点对应的断点标识。
[0121]
其中,断点标识是指断点发生时客户端上维护的指令标识的当前值,如客户端1上在编号被累加到2时监测到断点,此时的断点标识即为2。
[0122]
具体的,在各个客户端上可以按照一定的频率对客户端状态进行快照记录,所得到的记录内容能够表征客户端所对应的历史指令的历史标识。据此,本实施例中可以将这些历史标识中的最近一个标识作为断点标识。例如,各个客户端上按照1024*40毫秒或者2048*40毫秒的时长间隔对客户端上的游戏应用的游戏场景状态信息进行快照记录,由此,各个客户端上会记录最近所执行的指令所呈现的游戏场景状态信息,据此,客户端上将这些游戏场景状态信息所表征的最大编号作为断点标识。例如,客户端上记录有从编号为0到编号为1024的指令执行后所形成的游戏场景状态信息,包含各个游戏对象的位置、id和运动速率等信息,由此,客户端上在监测到断点时,将记录内容所表征的1024作为断点标识。
[0123]
在特殊的情况下,客户端上没有记录客户端状态,例如,游戏客户端上不对游戏场景状态信息做快照记录,此时客户端将0作为断点标识。
[0124]
步骤1003:根据断点标识,向服务端发送断点重传请求,以获得服务端发送的断点集合。
[0125]
其中,断点集合中包含断点标识对应的历史指令和排序在断点标识之后的所有指令标识对应的历史指令。具体实现中,客户端在与服务端之间的通信恢复的情况下,接收服务端发送的断点集合。
[0126]
需要说明的是,由于客户端与服务端之间存在断点,因此,存在服务端上的指令无法被同步到当前的客户端上的情况,基于此,本实施例中在监测到断点之后,基于断点标识向服务端请求断点之后的历史指令,即在出现断点的客户端上在恢复与服务端之间的通信的情况下,向服务端发送断点重传请求,断点重传请求中至少包含有断点标识,由此,服务端在接收到断点重传请求之后,将断点标识以及断点标识之后的所有指令标识对应的历史指令均返回给客户端,由此,客户端上可以接收到断点之后无法被同步来的所有历史指令。
[0127]
具体的,在服务端上保存有所有被各个客户端的所生成的指令,例如,如图11中所示,服务端的指令集合中包含有:一个编号为2的指令、两个编号为3的指令、两个编号为4的指令、一个编号为5的指令、三个编号为6的指令和两个编号为7的指令,因此,如果在客户端1上在编号被累加到4时监测到断点,那么客户端1上的指令集合中可能只包含有:一个编号为2的指令、两个编号为3的指令,因此,客户端1上在恢复与服务端之间的通信的情况下,可以向服务端发送断点标识4,由此,服务端上将两个编号为4的指令、一个编号为5的指令、三个编号为6的指令和两个编号为7的指令发送给客户端1,由此在客户端1上接收到历史指令:两个编号为4的指令、一个编号为5的指令、三个编号为6的指令和两个编号为7的指令。
[0128]
步骤1004:将断点集合中的历史指令添加到指令集合中。
[0129]
步骤1005:在指令集合中,从断点标识开始,执行指令集合中的指令。
[0130]
例如,如图11中所示,在客户端1上接收到历史指令:两个编号为4的指令、一个编号为5的指令、三个编号为6的指令和两个编号为7的指令之后,客户端1上从断点标识4开始执行相应的指令,由此,实现客户端1上的断点续传,因此,任一游戏玩家均可以在出现断线并恢复连接后观看到其他游戏玩家的完整动作。
[0131]
参考图12,为本技术实施例二提供的一种数据同步方法的实现流程图,该方法可以适用于服务端,该服务端实现至少两个客户端之间的通信,如图2中所示。本实施例中的技术方案主要用于降低服务端与客户端之间的传输数据量。
[0132]
具体的,本实施例中的方法可以包含如下步骤:
[0133]
步骤1201:在与至少两个客户端建立通信的情况下,监测来自所述客户端的指令,如果获得来自至少两个客户端中至少之一的第一指令,执行步骤1202,如果没有获得来自客户端的指令,返回执行步骤1201,继续监测来自所述客户端的指令。
[0134]
其中,第一指令中包含有操作数据。
[0135]
步骤1202:将第一指令给到至少两个客户端中的所有客户端,以使得其他客户端根据操作数据执行相应处理。
[0136]
具体的,服务端在接收到各个客户端发送来的指令后,会按照自己维护的指令标识为客户端发送来的指令设置统一的指令标识。
[0137]
进一步的,各个客户端在接收到服务端同步来的指令后,将指令添加到客户端的指令集合中,再按照前文中所述的方式执行指令集合中的指令,以实现画面输出,如游戏应用中的对象控制输出,再如教学应用中的教学内容的输出,等等。
[0138]
需要说明的是,本实施例中服务器还可以在接收任一客户端的断点重传请求后,按照请求将相应的历史指令反馈给客户端,等等。服务器的具体实现可以参考前文中的相应内容,此处不再详述。
[0139]
由上述方案可知,本技术实施例二提供的一种数据同步分法中,对于任一通过服务端建立通信的客户端,服务端上通过监测来自客户端的指令,从而在有指令来时,将指令同步给各个客户端,而客户端上的指令则是客户端上通过监测待同步数据,进而在监测到存在待同步的操作数据的情况下,生成指令并通过服务器给到各个客户端,而如果监测到没有操作数据需要同步,则继续监测而无需发送指令给其他客户端,由此,在现操作数据同步的同时,能够减少服务端与客户端之间的传输数据量。
[0140]
参考图13,为本技术实施例三提供的一种数据同步装置的结构示意图,该装置可以配置在与其他客户端通过服务端建立通信的任一客户端上。如图2中所示,至少两个客户端通过一服务端建立通信。本实施例中的技术方案主要用于降低服务端与客户端之间的传输数据量。
[0141]
具体的,本实施例中的装置可以包含如下单元:
[0142]
数据监测单元1301,用于在至少两客户端通过一服务端建立通信的情况下,监测所述客户端上的待同步数据;如果监测到所述至少两客户端中至少之一上存在待同步的操作数据,触发指令处理单元1302,如果监测到所述客户端上没有待同步的操作数据,继续监测所述客户端上的待同步数据;
[0143]
指令处理单元1302,用于生成第一指令并通过服务端给到所述至少两客户端中的所有客户端,第一指令中至少包含所述操作数据。
[0144]
由上述方案可知,本技术实施例三提供的一种数据同步装置中,对于任一通过服务端建立通信的客户端,通过监测客户端上的待同步数据,进而在监测到存在待同步的操作数据的情况下,生成指令通过服务端给到所有客户端,而如果监测到没有操作数据需要同步,则继续监测而无需发送指令给其他客户端,由此,在现操作数据同步的同时,能够减少服务端与客户端之间的传输数据量。
[0145]
在一种实现方式中,数据监测单元1301还用于在同步控制条件被满足的情况下,执行所述:监测所述客户端上的待同步数据;其中,所述同步控制条件包括:从所述客户端与所述服务端开始同步的时刻起,所述客户端上生成的指令被执行完成且监测执行次数小于监测预定次数;所述监测执行次数为从所述客户端与所述服务端开始同步的时刻起,执行监测所述客户端上的待同步数据的历史次数;所述监测预定次数为从所述客户端与所述服务端开始同步的时刻起,所包含的预设间隔阈值的数量。
[0146]
基于以上实现,在数据监测单元1301监测所述客户端上的待同步数据之前,还用于:获得开始时刻;所述开始时刻为所述服务端与所述客户端开始同步的时刻;根据当前时刻和所述开始时刻之间的时刻差值,获得间隔计数值;使用所述当前时刻,更新所述开始时刻;监测所述间隔计数值;如果所述间隔计数值大于或等于所述间隔阈值对应的阈值计数值,执行所述监测所述客户端上的待同步数据的步骤,并根据所述阈值计数值更新所述间隔计数值,再返回执行监测所述间隔计数值的步骤,直到所述间隔计数值小于所述阈值计数值;在等待预设的休眠时长之后,返回执行根据当前时刻和所述开始时刻之间的时刻差值,获得间隔计数值的步骤。
[0147]
在一种实现方式中,所述第一指令中还包含第一指令标识,所述客户端上配置有指令集合,所述指令集合用于存储所述服务端发送来的目标指令,所述目标指令的指令标识用于指示在所述指令集合中按照所述指令标识之间的顺序执行所述指令集合中的指令。
[0148]
基于以上实现,指令处理单元1302还用于:接收第二指令,所述第二指令中至少包含第二指令标识;将所述第二指令添加到所述指令集合中;在所述指令集合中,从所述第二指令标识开始,执行所述指令集合中的指令。
[0149]
基于以上实现,指令处理单元1302还用于:在监测到指令传输连接的断点的情况下,获得所述断点对应的断点标识;根据所述断点标识,向所述服务端发送断点重传请求,以获得所述服务端发送的断点集合,所述断点集合中包含所述断点标识对应的历史指令和排序在所述断点标识之后的所有指令标识对应的历史指令;将所述断点集合中的历史指令添加到所述指令集合中;在所述指令集合中,从所述断点标识开始,执行所述指令集合中的指令。
[0150]
在一种实现方式中,所述操作数据中至少包含对象参数和操作参数,所述操作数据用于指示执行所述对象参数对应的目标对象按照所述操作参数执行相应的操作。所述操作参数对应的被处理数据为定点数类型的数据。
[0151]
需要说明的是,本实施例中各单元的具体实现可以参考前文中的相应内容,此处不再详述。
[0152]
参考图14,为本技术实施例四提供的一种数据同步装置的结构示意图,该装置可以配置在服务端,该服务端实现至少两个客户端之间的通信,如图2中所示。本实施例中的技术方案主要用于降低服务端与客户端之间的传输数据量。
[0153]
具体的,本实施例中的装置可以包含如下单元:
[0154]
指令监测单元1401,用于在与至少两个客户端建立通信的情况下,监测来自所述客户端的指令,如果获得来自至少两个客户端中至少之一的第一指令,触发指令传输单元1402,如果没有获得来自客户端的指令,继续监测来自所述客户端的指令。
[0155]
其中,第一指令中包含有操作数据。
[0156]
指令传输单元1402,用于:将第一指令给到至少两个客户端中的所有客户端,以使得客户端根据操作数据执行相应处理。
[0157]
需要说明的是,本实施例中服务器还可以在接收任一客户端的断点重传请求后,按照请求将相应的历史指令反馈给客户端,等等。服务器的具体实现可以参考前文中的相应内容,此处不再详述。
[0158]
由上述方案可知,本技术实施例四提供的一种数据同步装置中,对于任一通过服务端建立通信的客户端,服务端上通过监测来自客户端的指令,从而在有指令来时,将指令同步给所有客户端,而客户端上的指令则是客户端上通过监测待同步数据,进而在监测到存在待同步的操作数据的情况下,生成指令并通过服务器给到各个客户端,而如果监测到没有操作数据需要同步,则继续监测而无需发送指令给其他客户端,由此,在现操作数据同步的同时,能够减少服务端与客户端之间的传输数据量。
[0159]
参考图15,为本技术实施例五提供的一种客户端的结构示意图,该客户端可以为在与其他客户端通过服务端建立通信的任一客户端。如图2中所示,至少两个客户端通过一服务端建立通信。本实施例中的技术方案主要用于降低服务端与客户端之间的传输数据量。
[0160]
具体的,本实施例中的客户端可以包含如下结构:
[0161]
存储器1501,用于存储应用程序和应用程序运行所产生的数据;
[0162]
处理器1502,用于执行应用程序,以实现:在至少两客户端通过一服务端建立通信的情况下,监测所述客户端上的待同步数据;如果监测到所述至少两客户端中至少之一上存在待同步的操作数据,生成第一指令通过服务端给到所述至少两客户端中的所有客户端,第一指令中至少包含所述操作数据,如果监测到所述客户端上没有待同步的操作数据,继续监测所述客户端上的待同步数据。
[0163]
另外,客户端中还可以包含其他部件,如显示屏、输入设备、通信模块等。显示屏可以用于画面的输出,输入设备可以用于输入操作的输入,而通信模块可以用于指令的传输。
[0164]
由上述方案可知,本技术实施例五提供的一种客户端中,对于任一通过服务端建立通信的客户端,通过监测客户端上的待同步数据,进而在监测到存在待同步的操作数据的情况下,生成指令通过服务端给到所有客户端,而如果监测到没有操作数据需要同步,则继续监测而无需发送指令给其他客户端,由此,在现操作数据同步的同时,能够减少服务端与客户端之间的传输数据量。
[0165]
参考图16,为本技术实施例六提供的一种服务端的结构示意图,该服务端实现至少两个客户端之间的通信,如图2中所示。本实施例中的技术方案主要用于降低服务端与客户端之间的传输数据量。
[0166]
具体的,本实施例中的服务端可以包含如下结构:
[0167]
存储器1601,用于存储应用程序和应用程序运行所产生的数据;
[0168]
处理器1602,用于执行应用程序,以实现:在与至少两个客户端建立通信的情况下,监测来自所述客户端的指令,如果获得来自至少两个客户端中至少之一的第一指令,将第一指令给到至少两个客户端中的所有客户端,以使得其他客户端根据操作数据执行相应处理,如果没有获得来自客户端的指令,继续监测来自所述客户端的指令。
[0169]
其中,第一指令中包含有操作数据。
[0170]
需要说明的是,本实施例中服务端中还可以包含其他部件,如通信模块等,以便于进行指令的传输,另外,服务端还可以在接收任一客户端的断点重传请求后,按照请求将相应的历史指令反馈给客户端,等等。服务器的具体实现可以参考前文中的相应内容,此处不再详述。
[0171]
由上述方案可知,本技术实施例六提供的一种服务端中,对于任一通过服务端建立通信的客户端,服务端上通过监测来自客户端的指令,从而在有指令来时,将指令同步给所有客户端,而客户端上的指令则是客户端上通过监测待同步数据,进而在监测到存在待同步的操作数据的情况下,生成指令并通过服务器给到各个客户端,而如果监测到没有操作数据需要同步,则继续监测而无需发送指令给其他客户端,由此,在现操作数据同步的同时,能够减少服务端与客户端之间的传输数据量。
[0172]
另外,本技术还提供了一种存储介质,存储介质中存储有计算机可执行指令,所述计算机可执行指令被处理器加载并执行时,实现如上任一项所述的数据同步方法。
[0173]
以游戏应用场景为例,针对游戏客户端与服务端之间的传输数据量较大的缺陷,基于以上本技术的技术方案,提出一种游戏帧同步方案,在服务端和客户端之间校准时间后,在服务器通知所有客户端并且自己开始以相同的时间间隔依次执行逻辑帧。由此,客户端上通过有没有帧操作来决定这一帧需不需要广播。而服务端上汇总帧命令后,向其他客户端广播帧命令。而且,客户端与服务端之间传输的数据仅仅是操作指令,即前文中的操作数据,不是状态属性,这样可以做的传输数据量极小。由此,各个客户端不受其他客户端延迟的影响,方便做断线重连以及回放。
[0174]
具体实现中,客户端与服务端之间的帧同步需要考虑跨平台方面的问题,因此,本技术中使用一种定点数来代替float。以游戏应用中模拟太阳系这个场景来说,场景中所有物体都有一个唯一entityid。可以用uint32来定义。
[0175]
在场景中,对于所有物体,不同的属性(以下简称component)可以按照实际需要是否绑定在这个entityid上,在entityid和component之外有系统(以下简称system)来运行这个游戏世界(以下简称entityworld),在显示部分通过renderer来处理所有的显示表现,这四部分配合就是ecs

r系统。整个ecs

r系统又有两部分组成:ecs可以在线程里处理,这样做的好处可以充分使用多核性能。r运行在主线程里通过ecs系统中标定好的数据脏标记来展现整个显示世界,如图17中所示,ecs和r(render)在各自的线程中进行。
[0176]
基于以上场景,本技术中提出的游戏帧同步方案具体如下:
[0177]
首先是确保帧率的一致性,通过datetime.now纠正时间流逝。具体参考前文中的伪代码,以演示如何纠正时间流逝,这部分在断线重连的时候依然很有效。若simulation.run中多消耗了时间,也没有关系,整个循环会像弹簧一样保证各个客户端在运行一段时间后所经历的帧数一致。
[0178]
其中,frametickcount=40*10000,表示逻辑帧间隔40毫秒,对应的ticks就是
400000。40毫米是个自定义数值,可以根据实际需求调整这个时间间隔。
[0179]
具体的,在simulation.run()中依次执行了如下行为,这也是核心逻辑部分,结合图18中所示的ecs(entityid component system)系统的结构,如图19中所示:
[0180]
1、每一个逻辑帧的调用,如图20和图21中所示,客户端c上分线程分别进行帧处理、网络数据传输和画面渲染,服务端s上分线程分别进行帧处理和网络数据传输,且,在客户端和服务端上各自按照40毫秒的间隔阈值进行帧编号处理,而客户端上的画面渲染则可以按照需求如20毫秒的间隔进行画面刷新:
[0181]
逻辑帧编号累加:每次监测将当前的帧编号加1;
[0182]
历史帧读取:重新读档的逻辑,即将获取逻辑帧命令集合依次执行,即断点重传;
[0183]
网络帧回滚:执行服务端分发的统一逻辑帧编号的命令,收到后将本地逻辑帧编号回溯至收到的帧数前一帧,并快速重新计算至当前帧;
[0184]
ecs系统执行:entity实体行为执行,即根据所有组件的状态,计算结果;
[0185]
ecs系统执行:输入控制器命令读取,即监听键盘,摇杆等输入设备;组件备份并发送当前逻辑帧中用户手动触发的命令给服务器。
[0186]
2、ecs系统执行:
[0187]
其中,系统中包含多个部分,其中,重力系统中包含位置组件、位移组件和质点组件,位移组件以transformcomponent{position,

}记录位移数据,质点组件以particlecomponent{mass,

}记录质点数据;
[0188]
移动系统movementcomponent{direction,speed,

}包含位置组件和位移组件;
[0189]
星体移动系统包含公转组件、自传组件和位置组件;
[0190]
碰撞系统包含位置组件;
[0191]
回收系统包含生命值组件和倒计时组件。
[0192]
其中,在图17中各个系统中分别计算对应的组件,并且修改最新的组件内容,这样各个系统依次执行完成就是我们想要的效果。以重力系统为例:在系统里获取位置和质点组件通过公式算出位移组件的方向,然后通过移动系统的计算将移动组件的方向和速度计算出来并修改位置组件的位置属性。这样就能实现太空万有引力的效果。
[0193]
需要说明的是,以上仅为游戏应用场景中的游戏帧同步的一种实现,在多种互联网应用中均可以使用本技术中的技术方案实现多客户端同步。例如多人教学互动,这种方式比视频的方式更加省流量,并且可以场景内互动。
[0194]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0195]
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
[0196]
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd

rom、或技术领域内所公知的任意其它形式的存储介质中。
[0197]
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本技术。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本技术的精神或范围的情况下,在其它实施例中实现。因此,本技术将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

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

相关文献