我有2D多人浏览器游戏。游戏包含类蛇玩家和充满不同颜色方块的世界。
当前,我从服务器发送这些数据:
因此,我不会发送冗余数据,而是将所有数据发送给所有人。修改客户端的骗子可以看到一切!因此,我需要根据客户的视口向他们发送数据。
对于类似蛇的玩家,我可能会检查玩家的最小和最大值,X和Y。
如果玩家A接近玩家B,则服务器将向客户端A发送有关玩家B的数据。 如果玩家A离玩家B太远,服务器将从客户端A移除玩家B。 仅当玩家A在附近时,服务器才会发送有关玩家B更改的数据。
但是我不确定如何发送有关块的数据。恐怕我会发送过多的冗余数据。
当玩家生成时,我将向他发送有关他附近的方块的数据。同样,当他附近的方块颜色改变时,我也会将其发送给他。
如果玩家向左移动,我将向他发送有关左侧区域的数据。但是我应该多久做一次呢?每当他旅行一个街区距离时,我都应该给他发送新的街区吗?
如果玩家决定去他已经去过的地方怎么办?我是否应该再次向他发送冗余数据?或者我可以检查一下那里的方块是否已更改。但是我怎么还记得那个球员已经看到了一些障碍?我可能不记得玩家看到的所有方块(方块的数量太大)。这样会影响性能。
如何保护我的游戏免受变焦作弊者的侵扰,并且不降低性能?
答案 0 :(得分:0)
因此,您尝试实现的功能有时称为网络气泡。每个玩家都可以获取他周围的数据(就像他周围的泡沫),但不是所有数据。因此,您可以定义发送给他的玩家周围的方块数量。例如,发送与他当前块直接相邻的所有块。
block1 - block2 - block3
block4 - player - block5
block6 - block7 - block8
关于如何记住块的问题,您将需要在客户端上使用某种存储阵列(例如,哈希图),在其中存储块。
然后,您的服务器需要提供一种可能性,以检查客户端阻止是否仍是最新的。这可以通过散列函数来完成。您的服务器将计算所请求块的哈希值,如果块中的数据发生更改,则哈希值也会更改。比较服务器的哈希值和存储的客户端块的哈希值,然后仅在它们不匹配时才发送块数据。