一种在C/S架构下的移动指令的同步及执行方法
技术领域
本发明涉及一种在C/S架构下的移动指令的同步及执行方法,特别涉及一种采用客户端先行执行,服务器端后续验证的同步和执行方法。
背景技术
典型的MMO游戏的组织结构是C/S方式的,表现为很多客户端连接到同一个服务器。每个客户端都可以接受本地玩家的操作指令,并以某种方式通知服务器端和其他玩家,以保持客户端与服务器端之间、客户端与客户端之间位置的同步。
通常,指令执行都是本地客户端暂不执行,先把指令发送到服务器端验证,验证通过后,再通知给所有客户端执行。例如,2010年9月15日公开的专利CN101094227B,涉及一种基于C/S架构的移动平台联网游戏消息交互方法,该方法包括客户端通过将消息设计为类后将所有的消息类封装为消息包……所述客户端使用消息包生成消息,将所述生成的消息向服务器端发送;所述服务器端接收所述消息后,根据解包操作代码对所述消息进行解包操作。其问题在于客户端和服务器端的时延有很大的不确定性,玩家输入指令到实际看到的反馈有一段可察觉到的等待时间,会影响对游戏的体验。
发明内容
本发明要解决的技术问题是:在C/S架构下,指令下达后,在本地客户端可以得到及时的反馈;本地玩家和远端玩家在客户端的位置模拟流畅且符合玩家预期,特别可以避免卡顿和瞬移。
本发明解决该技术问题采用的技术方案是:
一种在C/S架构下的移动指令的同步及执行方法,其特征在于,包括:
以客户端为基准的移动指令的同步和执行,包括:客户端收到用户输入指令后直接执行该指令,并同步给服务器;服务器收到指令后,和客户端分别执行移动指令,并验证指令的有效性;若指令有效,则将新指令同步给其他客户端执行;
由服务器端控制的移动指令的同步和执行,包括采用一种平滑的方式执行新指令。
优选地,其中客户端在执行输入指令之前先判断当前是否处于用户可控状态。
优选地,其中客户端在执行输入指令前,根据本地缓存的状态作初步的有效性判断。
优选地,客户端和服务器端都各自执行,仅在移动状态发生变化后,以事件方式通知对方。
优选地,其中服务器端具有位置和移动状态历史记录表,用于验证客户端指令的有效性。
作为有益改进,服务器端定期根据指令控制执行角色的状态和位置,并存储到历史记录表中。
作为有益改进,其中会根据客户端和服务器端的时延决定历史记录表缓存所需要的存储空间。
优选地,其中在服务器端发生不可控的移动状态变更时,产生一条新的移动指令。
优选地,其中所述指令的内容包括了指令发出时角色的状态、位置、朝向信息、移动目标点、移动方向、速度。
此外,本发明还涉及一种在C/S架构下的移动指令的同步及执行系统,其特征在于,该系统包括:
以客户端为基准的移动指令的同步和执行模块,其中客户端收到用户输入指令后直接执行该指令,并同步给服务器;服务器收到指令后,和客户端分别执行移动指令,并验证指令的有效性;若指令有效,则将新指令同步给其他客户端执行;
由服务器端控制的移动指令的同步和执行模块,其采用一种平滑的方式执行新指令。
优选地,以客户端为基准的移动指令的同步和执行模块会在客户端执行输入指令之前先判断当前是否处于用户可控状态。
优选地,以客户端为基准的移动指令的同步和执行模块会在客户端执行输入指令之前,根据本地缓存的状态作初步的有效性判断。
优选地,以客户端为基准的移动指令的同步和执行模块在服务器端具有位置和移动状态历史记录表,用于验证客户端指令的有效性。
优选地,以客户端为基准的移动指令的同步和执行模块会根据客户端和服务器端的时延决定历史记录表缓存所需要的存储空间。
优选地,服务端发生不可控的移动状态变更时,会产生一条新的移动指令,并同步给所有客户端,纠正该玩家在所有客户端的错误位置。
优选地,其中所述指令的内容包括了指令发出时角色的状态、位置、朝向信息、移动目标点、移动方向、速度。
本发明的有益效果是:用户输入指令后,本地玩家无需等待客户端和服务器信息交互,不会存在延迟现象;操作指令首先在本地客户端执行,保证了最快的响应速度;服务器端维护所有玩家一段时间内位置和状态的历史记录,通过比对指令发生的时刻玩家在客户端和服务器端的状态差异,可以有效判定玩家操作指令的有效性,安全性好;客户端有一套平滑执行移动指令的方法,根据当前位置和新的预期位置做平滑,可以杜绝时延带来的瞬移和漂移现象;所有同步都是基于事件的,同步数据量小。
附图说明
下面结合附图对本发明的具体实施方式作进一步说明:
图1为本发明中客户端发出的移动指令执行过程的示意图;
图2为本发明中服务器端生成的指令执行过程的示意图;
图3为本发明中客户端收到远端指令后平滑执行的效果示意图。
具体实施方式
需要说明一点,在图1-2中,T表示时间。如图1所示,在一实施例中,玩家向客户端Ct输入指令(Cin),客户端首先判断当前是否处于用户可控状态,并且/或者根据本地缓存的状态预判指令是否可以执行。如果处于用户可控状态并且/或者可以执行,则不需要经由服务器端S判断,立刻执行执行指令①,并同步给服务器端②。由于服务器端S的状态变更都会以事件方式通知客户端,预判结果可以保证很高的正确性。从用户输入指令,到指令执行并在屏幕上反馈出来,间隔时间理论上可以是最短时间,属于最优策略。
服务器端S维护了每个玩家角色的位置和移动状态历史记录。服务器端S定期根据指令控制执行角色的状态和位置,并存储到历史记录表中。服务器端S收到指令后,根据该指令发生的时刻,从历史记录中取出角色在服务器端的状态和位置,与客户端发来的状态和位置信息作对比,验证指令有效性,决定指令是否可以执行。其中历史记录会带来一定的存储开销,在一个优选的实例中,会根据客户端和服务器端S的时延决定记录缓存所需要的存储空间。若指令可以执行,则指令发出时刻之后的历史记录将被回滚,服务器端S根据新的指令重新执行和执行③,同时,服务器S将该指令同步给其他客户端B1/B2/……④,客户端收到该指令后,以平滑的方式执行⑤,这里要说明一点,根据上文描述,本地客户端已经执行了指令,因此服务器端只需要将该指令同步给其他客户端。否则如果服务器如常规技术手段那样,将指令同步给所有的客户端,本地客户端会再次执行该指令,导致抖动。
其中客户端接收到的玩家操作指令,服务器端生成的新的状态变更指令,都以事件的方式通知对方知晓,服务器端通知非指令来源链接时亦以事件的形式发出,其中“指令来源链接”是指指令的原始来源,换言之,非指令来源链接就是指上文所述的其他客户端。
在一个优选实例中,指令的内容包括指令发出时角色的状态、位置、朝向信息,还包括了移动目标点、移动方向、速度等信息。这些信息对执行移动过程是必要的,服务器端还根据这些信息做指令有效性的验证。
在另一实施例中,服务器端S亦可以产生和发出移动指令,通常会使玩家进入不可控的移动状态。服务器端S发出的指令会发送给所有客户端。如图2所示,服务器端S生成玩家的指令输入(Sin)后,会立即模拟执行①,并同步给所有客户端②,客户端Ct、B1/B2/……在接收到服务器端S指令后,会以一种平滑地方式执行③。具体平滑效果如图3所示,客户端会根据当前位置和新指令拟合出一条平滑曲线,其中OB段:角色已经执行的运动轨迹;BC段:若角色没有收到新指令,将按此轨迹运动;A:角色受到的新指令中指定指令应该在A位置执行;AD段:按照角色新指令,角色应该改变方向,按该轨迹运行;BD段:角色根据当前位置和新指令做平滑处理后,角色的实际运行轨迹。
服务端在发生不可控的移动状态变更时,会产生一条新的移动指令,并同步给所有客户端,纠正该玩家在所有客户端的错误位置。
此外,本发明还涉及一种在C/S架构下的移动指令的同步及执行系统,其特征在于,该系统包括:以客户端为基准的移动指令的同步和执行模块,其中客户端收到用户输入指令后直接执行该指令,并同步给服务器;服务器收到指令后,和客户端分别执行移动指令,并验证指令的有效性;若指令有效,则将新指令同步给其他客户端执行;由服务器端控制的移动指令的同步和执行模块,其采用一种平滑的方式执行新指令。
在一优选实施例中,以客户端为基准的移动指令的同步和执行模块会在客户端执行输入指令之前先判断当前是否处于用户可控状态以及/或者根据本地缓存的状态作初步的有效性判断。
其中,以客户端为基准的移动指令的同步和执行模块在服务器端具有位置和移动状态历史记录表,用于验证客户端指令的有效性。
在一优选实施例中,以客户端为基准的移动指令的同步和执行模块会根据客户端和服务器端的时延决定历史记录表缓存所需要的存储空间。
在一优选实施例中,由服务器端控制的移动指令的同步和执行模块会在服务器端发生不可控的移动状态变更时,产生一条新的移动指令,并同步给所有客户端,纠正该玩家在所有客户端的错误位置。
其中所述指令的内容包括了指令发出时角色的状态、位置、朝向信息、移动目标点、移动方向、速度。
其中,本发明涉及的一种在C/S架构下的移动指令的同步及执行系统与上文所述的一种在C/S架构下的移动指令的同步及执行方法的其他对应技术特征等同。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式。只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。即使个别的技术特征在不同的权利要求中引用,本发明还可包含共有这些特征的实施例。