онлайн лобби - список игр - PullRequest
1 голос
/ 05 июня 2010

Читая немного о предмете, и из любопытства, онлайн-игры, которые поддерживают систему «лобби», в которой перечислены игры;
Как они синхронизируют каждого клиента с текущим состоянием списка игр?

Я говорю в терминах "", которые запрашивают обновление списка игр", а не в терминах, управляемых событиями (состояние игры изменяется и сразу же передает его <--- не масштабируется!). </p>

Возможные сценарии:
Сервер содержит 5000 подключений к онлайн-игрокам.
Имеет список из 1000 игр.
Клиент запрашивает обновление списка игр каждую секунду.
Теперь серверу нужно пройти по всему списку игр и сравнить время последнего обновления каждой конкретной игры, а затем, если он увидит, что последнее обновление игрока старше, он отправит обновление.
Это означает, что каждую секунду он будет иметь (5000 * 1000 = 5 000 000 ) итераций !

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

Я думал о том, чтобы иметь кеш. Каково ваше решение?

Ответы [ 2 ]

2 голосов
/ 05 июня 2010

Во-первых, 5 миллионов сравнений в секунду не будут заметно облагать налогом современное оборудование. Давайте предположим, что сравнение занимает 10 циклов на процессоре с частотой 1 ГГц. Тогда это приведет к загрузке процессора всего на 5%. Конечно, это можно легко оптимизировать, но у нас есть более важные дела, не так ли?

Гораздо более вероятным узким местом является пропускная способность сети. Действительно ли мне нужно передавать данные о 1000 играх каждому клиенту каждую секунду? Давайте предположим, что 100 байтов данных за игру. Это будет равняться полосе пропускания около 1 Мбит для каждого игрока.

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

1 голос
/ 05 июня 2010

Вы можете изменить порядок: при каждом изменении списка игр вы отправляете всем своим клиентам обновление.

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

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

...