Anubis
@Anubis
Люблю корейскую кухню и веб-разработку

Игровой сервер на node.js, хранить перечни игроков и комнат в object или array?

Допустим, есть некий game.js, содержащий перечень объектов класса player.js , отвечающих за общение с подключёнными сокетами (внутри каждого — сокет и набор служебных методов), а также перечень объектов класса room.js, отвечающих за игровые лобби и сессии. Игрушка — условно-пошаговая с использованием active time battle (ATB) — право хода даётся игроку при заполнении его шкалы хода.

Перечень комнат и подключённых игроков хранить в объекте или в массиве? Вопрос с точки зрения скорости доступа к нужному экземпляру: в object можно обратиться по ключу (уникальный id игрока) напрямую, но перебор в массиве более быстрый. Иногда нужно обратиться к конкретному экземпляру, иногда — к нескольким. Порой может возникнуть ситуация, когда требуется сообщить сигнал всем объектам перечня (отсюда вопрос про array или object), пример — в следующем абзаце.

Второй вопрос вытекает из первого. Требуется реализовать некий game loop для всех игровых "комнат" — заполнять им шкалу ATB. Предполагаю делать перебор всего списка комнат каждые 0.1-0.2 секунды и начислять им этот "шаг". Подключённым к серверу, но не находящимся в данный момент в боевой сессии, нужно каждые 3-5 секунд восстанавливать показатели здоровья. Опять же, напрашивается перебор массива экземпляров player.js с проверкой условия "не находится в игровой сессии".

Корректна ли такая реализация? Число запущенных "комнат" может исчисляться несколькими сотнями при хорошем онлайне, число игроков — тысячами.

Благодарю за любые советы и подсказки.
  • Вопрос задан
  • 2915 просмотров
Пригласить эксперта
Ответы на вопрос 3
@suslik2015
хранить в объекте или в массиве

В js массив это объект.
Ответ написан
@vasIvas
Начну со второго вопроса - а Вам не кажется, что нет нужды каждую сотую секунды делать обновления индикатора? Просто можно сделать на сервере, типа, модели комнат, в которой
будет флаг, некий коэффициент, который будет при расчетах браться. А по началу этого события
рассылать на клиенты сообщение, чтобы представления самостоятельно уменьшали тот или иной
индикатор. А если кто-то свое приложение причитерит, то это ему не поможет, так как на сервере
все равно по коэффициенту известно правильное значение.

А по первому тут Вам нужно тестировать, на какие операции больше будет затрат.
А то можно вообще коллекцию на основе массива для итерации сделать + хеш индекса
по ключу.
Ответ написан
@aleks_raiden
При таких объемах - разницы не будет практически. Восстановление ATB можно сделать через события - вы по таймеру генерируете евент - addATBPoints и параметром передаете сколько восстановить, каждый игрок подписывается на это событие - и по его наступлению обрабатывает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы