Отправить данные с сервера в зависимости от позиции игрока - PullRequest
0 голосов
/ 23 сентября 2018

У меня 2D многопользовательская браузерная игра.Игра содержит змееподобных игроков и мир, заполненный сеткой разноцветных блоков.

В настоящее время я отправляю эти данные с сервера:

  • , если появляется новый игрок - данные обо всех блоках и игрокахему и данные о недавно появившемся игроке другим
  • , если кто-то меняет свой ход - данные о его следе, позиции и направлении к каждому
  • , если цвет некоторых блоков изменяется - данные об этомВсе

Поэтому я не отправляю избыточные данные, но отправляю все данные всем.Мошенник с измененным клиентом мог видеть все!Поэтому мне нужно отправлять данные клиентам, основываясь на их окне просмотра.


Для змееподобных игроков я, вероятно, проверю мин и макс, X и Y игрока.

Если игрок А получаетРядом с игроком B сервер отправит клиенту A данные об игроке B. Если игрок A слишком далеко от игрока B, сервер удалит игрока B из клиента A. Сервер отправит данные об изменении игрока B, только если игрок A находится рядом.


Главный вопрос

Но я не уверен, как мне отправлять данные о блоках.Боюсь, я отправлю слишком много избыточных данных.

Когда появится игрок, я отправлю ему данные о блоках рядом с ним.Также, когда цвет блоков рядом с ним изменится, я отправлю ему его.

Если игрок отправится влево, я отправлю ему данные о блоках слева.Но как часто я должен это делать?Должен ли я отправлять ему новые блоки каждый раз, когда он проезжает расстояние в один блок?

Что, если игрок решит пойти туда, где он уже был?Должен ли я отправить ему снова избыточные данные?Или я могу проверить, не были ли изменены блоки.Но как я могу вспомнить, что игрок уже видел несколько блоков?Вероятно, я не могу вспомнить все блоки, которые видел игрок (количество блоков слишком велико).Это ухудшит производительность.

Как я могу защитить свою игру от мошенников с зумом и не снизить производительность?

1 Ответ

0 голосов
/ 26 сентября 2018

То, что вы пытаетесь реализовать, иногда называют сетевым пузырем.Каждый игрок получает данные вокруг себя (как пузырь вокруг него), но не все данные.Таким образом, вы можете определить количество блоков вокруг игрока, которые будут отправлены ему.Например, отправить все блоки, непосредственно примыкающие к его текущему блоку.

block1 - block2 - block3

block4 - player - block5

block6 - block7 - block8

Для вопроса о том, как запоминать блоки, вам понадобится какой-нибудь массив хранения на стороне клиента (например, хэш-карта), в котором вы храните свои блоки.

Затем на вашем сервере должна быть возможность проверить, обновлен ли блок клиентов.Это можно сделать с помощью хэш-функции.Ваш сервер вычисляет хеш запрашиваемого блока. Если данные в блоке изменяются, значение хеш-значения изменяется.Хэши сервера и сохраненные клиентские блоки сравниваются, а затем блок-данные отправляются только тогда, когда они не совпадают.

...