MMORPG移动协议机制
MMORPG moving protocol mechanism
我想从头开始构建一种小型(非常小和简单)的 MMORPG 游戏,在给定的网格内进行点击移动(类似于在线口袋妖怪游戏)。当我点击一个单元格时,玩家将移动以到达指向的区域(使用 A* 等寻路算法)。但是,我不知道如何构建运动系统的网络协议。而且,谷歌搜索这个主题似乎对我帮助不大。我需要做出选择:-要么每次我从一个单元移动到另一个单元时向服务器发送一条消息(这根本没有效率,因为如果我们处于 100 毫秒延迟网络中,我只能感知 10 次移动/秒如果我要求服务器确认移动,它只能执行 5 次移动/秒)- 每次玩家想要更改其方向(它单击另一个单元格)时,我都会发送一条消息。客户端定期将其位置发送到服务器,并检查它是否与目的地一致。
第二个解决方案看起来比第一个好很多,我认为真正的游戏系统必须实施该策略。我错了吗?
此外,我们如何基于该解决方案构建系统,使修改后的(被黑的)客户端无法发送虚假位置并传送到他们想要的任何地方?真实的系统是否实现了类似于 "incoherent sent position" 系统的某种想法,试图检测并修复这些问题?
或者,有没有更简单的实现方式?非常感谢
在实时游戏中,我会创建一个 panthing 机制。我会使用如下公式:速度 * 时间 = 距离。
现在,如果您 运行 在客户端和服务器中使用相同的逻辑,您只需要在开始时发送移动逻辑,并且服务器可以在行进距离后以完成消息进行应答。 (最后比较,防止作弊,服务器永远赢)
现在,如果客户取消前往其他地方的行程,您将发送行程取消和行程时间。更改 panthing 时也是如此(在这种情况下,您发送一条新路径,盯着新的时间和地点)。
感谢 ScarletMerlin 的回答,我认为我的问题有一个简单的解决方案。
当玩家想要从一个位置(例如 0,0)移动到另一个位置(例如 10,10)时,它会向服务器发送 "MOVE 10 10" 消息。
然后,只有服务器会应用寻路算法,并在每次移动位置后发送给客户端。 (例如,通过消息 CURRENTLY_ON X Y)。然后,客户端将更新玩家的位置。
这是一种从服务器到客户端的自动同步。由于流水线,它还解决了第一个解决方案的问题(一次移动和一次移动一个 ACK)。例如,如果网络有 1000 毫秒的延迟并且移动设置为 50 毫秒,我们将只在时间 1000、1050、1100、1150 等接收消息,所以,当玩家改变方向时,我们只会感觉到延迟.
当从一个方向改变到另一个方向时,用户也会感觉到一些滞后,但如果我们假设延迟非常低并且是对称的(这似乎不是一个太强的假设),它就不会被感知到那么多(因为更改方向通常会在 CURRENTLY_ON 消息发送之前到达,服务器可以中断其当前操作(直接进行)以处理新的操作)。
我想从头开始构建一种小型(非常小和简单)的 MMORPG 游戏,在给定的网格内进行点击移动(类似于在线口袋妖怪游戏)。当我点击一个单元格时,玩家将移动以到达指向的区域(使用 A* 等寻路算法)。但是,我不知道如何构建运动系统的网络协议。而且,谷歌搜索这个主题似乎对我帮助不大。我需要做出选择:-要么每次我从一个单元移动到另一个单元时向服务器发送一条消息(这根本没有效率,因为如果我们处于 100 毫秒延迟网络中,我只能感知 10 次移动/秒如果我要求服务器确认移动,它只能执行 5 次移动/秒)- 每次玩家想要更改其方向(它单击另一个单元格)时,我都会发送一条消息。客户端定期将其位置发送到服务器,并检查它是否与目的地一致。
第二个解决方案看起来比第一个好很多,我认为真正的游戏系统必须实施该策略。我错了吗?
此外,我们如何基于该解决方案构建系统,使修改后的(被黑的)客户端无法发送虚假位置并传送到他们想要的任何地方?真实的系统是否实现了类似于 "incoherent sent position" 系统的某种想法,试图检测并修复这些问题?
或者,有没有更简单的实现方式?非常感谢
在实时游戏中,我会创建一个 panthing 机制。我会使用如下公式:速度 * 时间 = 距离。
现在,如果您 运行 在客户端和服务器中使用相同的逻辑,您只需要在开始时发送移动逻辑,并且服务器可以在行进距离后以完成消息进行应答。 (最后比较,防止作弊,服务器永远赢)
现在,如果客户取消前往其他地方的行程,您将发送行程取消和行程时间。更改 panthing 时也是如此(在这种情况下,您发送一条新路径,盯着新的时间和地点)。
感谢 ScarletMerlin 的回答,我认为我的问题有一个简单的解决方案。
当玩家想要从一个位置(例如 0,0)移动到另一个位置(例如 10,10)时,它会向服务器发送 "MOVE 10 10" 消息。
然后,只有服务器会应用寻路算法,并在每次移动位置后发送给客户端。 (例如,通过消息 CURRENTLY_ON X Y)。然后,客户端将更新玩家的位置。
这是一种从服务器到客户端的自动同步。由于流水线,它还解决了第一个解决方案的问题(一次移动和一次移动一个 ACK)。例如,如果网络有 1000 毫秒的延迟并且移动设置为 50 毫秒,我们将只在时间 1000、1050、1100、1150 等接收消息,所以,当玩家改变方向时,我们只会感觉到延迟. 当从一个方向改变到另一个方向时,用户也会感觉到一些滞后,但如果我们假设延迟非常低并且是对称的(这似乎不是一个太强的假设),它就不会被感知到那么多(因为更改方向通常会在 CURRENTLY_ON 消息发送之前到达,服务器可以中断其当前操作(直接进行)以处理新的操作)。