【问题标题】:Updating the game state in a multiplayer game在多人游戏中更新游戏状态
【发布时间】:2021-05-17 08:46:25
【问题描述】:

我正在开发一款多人游戏。每个客户都有一个在共享环境中移动的角色。
我使用 socket.io 创建房间并使用 peer.js 在客户端之间创建点对点连接。
我要做的是让每个客户端都能更新他地图中其他玩家角色的位置。
为此,每个客户端都应该知道其他玩家的键盘光标(箭头键)的状态,以便他可以通过行走动画移动其对应的角色。

P2P:我正在考虑在客户端之间创建双工流,以便每个客户端都有其他玩家的键盘光标状态,以便他可以使用适当的动画移动他们的角色...
套接字:我也可以使用套接字通过服务器传递信息,但是我必须每秒发送 60 次游标状态的更新,因为游戏是 60 fps,这会产生很多套接字消息。我不确定这是处理它的最有效方法

让每个人都了解其他玩家状态的最有效方法是什么?任何建议将不胜感激。谢谢。

【问题讨论】:

    标签: node.js p2p multiplayer peerjs real-time-multiplayer


    【解决方案1】:

    实际上,您的游戏可能是 MMORPG 游戏或 CS/CSGO 之类的小演示。

    对于这样的游戏,我们总是在主进程(工作进程)中有一个循环,其频率约为每秒几帧(比如 20 帧)。在每一帧中,客户端都会处理从其他人那里收到的数据包以及来自pleyer的选项。

    如果这里是20帧,那就意味着每帧不能超过50ms,所以如果在WLAN中会造成一些延迟并且发生一些丢包。

    如果你想用P2P来同步玩家动作,这里有一个问题:当玩家数量激增时,连接的复杂性也随之增加。更重要的是,你需要一个可靠的连接协议,这意味着你需要知道如何使用 QUIC 之类的东西,或者自己编写一个可靠的 UDP。

    所以我认为最有效的方法可能是继续使用 C/S 模型而不是 P2P,前提是您的游戏将在 LAN 中使用并且有很多玩家。

    【讨论】:

    • 我明白了。而对于玩家之间共享的数据包,共享光标状态还是共享地图中角色的位置是一种常见的做法?如果我只是分享位置,我看不出如何平滑地再现移动动画..
    • 这就是 C/S 更好的原因,它每帧在某个特定区域广播玩家在你周围的新位置,而不是每次通过 p2p 移动时向所有人广播。
    • 我的意思是我也可以使用 C/S 在每一帧广播玩家的移动(或没有移动)......但为了精确,我认为最好广播位置。我将尝试使用 C/S 模型..
    • 你需要知道,真正的精确度是不需要的,因为我们人类感觉不到那样的东西,而框架是平衡的权衡。
    • 我使用的是 C/S 模型。每个玩家在每一帧都将他的坐标发送到服务器,服务器将信息广播给同一个房间的玩家。效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多