0

我有 2D 多人浏览器游戏。游戏包含类似蛇的玩家和充满不同颜色块网格的世界。

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

  • if new player spawn - 关于他的所有方块和玩家的数据以及关于其他人的新生成的玩家的数据
  • 如果有人改变他的移动 - 关于他的轨迹、位置和方向的数据给每个人
  • 如果某些块的颜色发生了变化 - 向所有人提供有关它的数据

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


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

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


主要问题

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

当玩家生成时,我将向他发送有关他附近块的数据。另外,当他附近的方块颜色发生变化时,我会发送给他。

如果玩家将向左移动,我将向他发送有关左侧块的数据。但我应该多久做一次?每次他行驶一个街区距离时,我应该给他发送新街区吗?

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

我怎样才能保护我的游戏免受缩放作弊器的影响并且不降低性能?

4

1 回答 1

0

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

block1 - block2 - block3

block4 - player - block5

block6 - block7 - block8

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

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

于 2018-09-26T10:07:33.180 回答