Представьте себе большую комнату (4000 х 4000 ч), в которой находятся игроки и предметы (объекты мира). Комната пространственно разделена сеткой 10 x 10 для обнаружения столкновений и изменений в окне просмотра игрока.
- Зеленый прямоугольник: Item
- Красный прямоугольник: окно просмотра игрока
В настоящий момент на сервере каждый игрок содержит список всех объектов мира в своем текущем окне просмотра. Когда игрок меняет свою позицию, новые элементы обнаруживаются в окне просмотра, по сравнению с его текущим списком видимых объектов, и изменения отправляются клиенту. Его текущий видимый список обновляется новыми найденными объектами
HashSet<WorldObject> changes = new HashSet<>(foundObjects);
changes.removeAll(player.getVisibleObjects());
Клиент ведет список всех сущностей, которые он видел, отображает их в мире и ждет нового ввода.
Теперь моя проблема возникает , когда другой игрок берет предмет, уведомляет об этом окружающих игроков, соответствующим образом обновляет локальный список предметов и прекращает рендеринг предмета. Это отлично работает. Но игроки за пределами области просмотра не уведомляются об этих изменениях, поэтому, как только они окажутся в сетке, они все равно увидят визуализируемый элемент.
Как обычно решаются подобные проблемы? Мой подход хорош?