node.js - 根据玩家位置从服务器发送数据

标签 node.js algorithm websocket viewport anti-cheat

我有 2D 多人浏览器游戏。游戏包含像蛇一样的玩家和充满不同颜色方 block 网格的世界。

目前我从服务器发送这些数据:

  • 如果新玩家生成 - 所有方 block 和玩家的数据给他,新生成玩家的数据给其他人
  • 如果有人改变了他的 Action - 关于他的踪迹、位置和方向的数据将提供给每个人
  • 如果某些方 block 的颜色发生变化 - 向所有人提供相关数据

所以我不发送冗余数据,而是将所有数据发送给每个人。修改客户端的骗子可以看到一切!所以我需要根据客户的视口(viewport)向客户发送数据。


对于像蛇一样的玩家,我可能会检查玩家的最小值和最大值、X 和 Y。

如果玩家 A 靠近玩家 B,服务器将向客户端 A 发送有关玩家 B 的数据。 如果玩家 A 离玩家 B 太远,服务器会将玩家 B 从客户端 A 中移除。 仅当玩家 A 在附近时,服务器才会发送有关玩家 B 更换的数据。


主要问题

但我不确定应该如何发送有关 block 的数据。恐怕我会发送太多冗余数据。

当玩家重生时,我会向他发送有关他附近方 block 的数据。当他附近的方 block 颜色改变时,我也会发送给他。

如果玩家向左移动,我会向他发送有关左侧方 block 的数据。但是我应该多久做一次呢?每次他移动一个街区的距离时,我是否应该给他发送新的街区?

如果玩家决定去他已经去过的地方怎么办?我应该再次向他发送冗余数据吗?或者我可以检查那里的 block 是否已更改。但是我怎么能记得玩家已经看过一些方 block 呢?我可能不记得玩家见过的所有方 block (方 block 数量太大)。这对性能不利。

如何保护我的游戏免受缩放作弊者的侵害并且不降低性能?

最佳答案

因此,您尝试实现的有时称为网络泡沫。每个玩家都会获得他周围的数据(就像他周围的气泡),但不是所有数据。所以你可以定义发送给他的玩家周围的方 block 数量。例如,发送与他当前 block 直接相邻的所有 block 。

block1 - block2 - block3

block4 - player - block5

block6 - block7 - block8

对于如何记住 block 的问题,您需要在客户端使用某种存储阵列(例如 HashMap ),在其中存储您的 block 。

然后您的服务器需要提供一种可能性来检查客户端 block 是否仍然是最新的。这可以通过散列函数来完成。您的服务器计算所请求 block 的哈希值,如果 block 中的数据发生变化,则哈希值也会发生变化。比较服务器和存储的客户端 block 的哈希值,然后仅在它们不匹配时才发送 block 数据。

关于node.js - 根据玩家位置从服务器发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52466149/

相关文章:

c++ - 数组调试不正确的输出,复杂的算法

algorithm - 这个修改后的选择排序算法的运行时间是多少?

python - 如何在 Tornado ( Python ) 服务器中测试 Max Open Websocket Limit

html - Perl-我如何知道套接字客户端何时断开连接(用户关闭窗口/浏览器时)

node.js - 在 VS Code 中启用 Javascript 的隐式类型检查会导致 "Cannot find name ' require'"错误

javascript - For 循环不会按原始顺序附加到其他 json

algorithm - 如何对 2 个未排序列表进行排序并创建一个排序列表?

typescript - 如何在 typescript 上重新连接(重新订阅)到 websocket

javascript - JWT 解码适用于 React Native 但不适用于 React

javascript - ESLint 与 Babel plugin-proposal-export-default-from