| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  |  |  | на php - не знаю как.  29.10.08 19:46  Число просмотров: 4767 Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
 |  
| на php - не знаю как. Представь что твой cgi скрипт не выходит п оокончании работы, а завязывается в бесконечный цикл ожидания новостей. От юзера, от сервера, от кого угодно. При этом соединение остаётся открытым. Апплет на машине постоянно получает чего-то от сервера.
 
 примерно так.
 |  | <theory> |  
| Синхронизация в многопользовательских онлайн играх  29.10.08 09:53 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 |  
| Пытаюсь разобраться вот с какой вещью. Например, есть 3D сцена, по которой гуляют несколько человек (зарегистрированных пользователей), в том числе я. 
 Со мной понятно: когда я нажимаю на клавиатуру или мышь данные передаются серверу и он фиксирует моё перемещение. А как быть с другими пользователями, чтобы на моём компе их перемещения тоже отображались?
 
 То, что придумал я – это несколько раз в секунду опрашивать сервер о текущем состоянии сцены и на основе полученных данных прорисовывать сцену. Но такой вариант трафика и других ресурсов очень много жрать будет.
 
 Как можно решить такую проблему более цивилизованно?
 |  
|  | Всем спасибо за много информации. Буду вникать.  30.10.08 02:24 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 |  
|  |  
|  | Скорее не опрос, а push  29.10.08 17:45 Автор: PS <PS> Статус: Elderman
 |  
| > Со мной понятно: когда я нажимаю на клавиатуру или мышь > данные передаются серверу и он фиксирует моё перемещение. А
 > как быть с другими пользователями, чтобы на моём компе их
 > перемещения тоже отображались?
 >
 > То, что придумал я – это несколько раз в секунду опрашивать
 > сервер о текущем состоянии сцены и на основе полученных
 > данных прорисовывать сцену. Но такой вариант трафика и
 > других ресурсов очень много жрать будет.
 >
 
 При действии пользователя данные отсылаются серверу. Сервер рассылает их всем подписчикам (другим пользователям).
 Клиент умный. Клиент умеет вычислять возможную точку находжения объектов в последующие моменты времени.
 Например от пользователя не передается информация о точке нахождения, а передается информация о действии. Я нахожусь там то и там то, и начал бежать на северо-восток, с такой-то скоростью. Все.
 Все остальные клиенты начинают вычислять где этот перец сейчас может находится.
 
 А вообще, самый простой способ разобраться - поставить любую online игру и проанализировать снятый сниффером траффик.
 |  
|  |  | Боюсь, снифить трафик бесполезно. Высоковероятно - данные криптуются для защиты от читеров.  29.10.08 19:45 Автор: Garick <Yuriy> Статус: Elderman
 |  
|  |  
|  |  |  | Ну, всегда можно попробовать...  30.10.08 19:07 Автор: Fighter <Vladimir> Статус: Elderman
 |  
|  |  
|  |  | "Сервер рассылает их всем подписчикам (другим...  29.10.08 17:48 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 Отредактировано 29.10.08 17:51  Количество правок: 1
 |  
| "Сервер рассылает их всем подписчикам (другим пользователям)" А про это можно поподробнее? Я всегда думал, что сервер инициативу не проявляет, а только по запросу клиента всё делает.
 
 ЗЫ. Мне кажется не факт, что в игре, которая мне попадётся будет оптимальный алгоритм передачи данных.
 |  
|  |  |  | Это как вариант  29.10.08 18:11 Автор: PS <PS> Статус: Elderman
 |  
| > "Сервер рассылает их всем подписчикам (другим > пользователям)"
 > А про это можно поподробнее? Я всегда думал, что сервер
 > инициативу не проявляет, а только по запросу клиента всё
 > делает.
 >
 > ЗЫ. Мне кажется не факт, что в игре, которая мне попадётся
 > будет оптимальный алгоритм передачи данных.
 
 В отличие от web, online игра должна реагировать очень быстро. А пока клиент прочухается, пока отошлет запрос, пока сервер отработает пол миллиона запросов - ты, как игрок, уснешь перед монитором.
 Как вариант: избавится от логики запросов. Клиенту все равно нужны свежие данные (иначе смысла в игре нет), так зачем от него ждать запросов? Можно при появлении обновлений в контексте - сразу поставлять их клиенту.
 При этом сервер может даже не отслеживать положении игроков, или отслеживать их на отдельном сервере не в рилтайм режиме, с целью выискивания читтеров.
 Например, если ты подменяешь стандартный игровой клиент своей чит-программой, которая игнорирует карту, и проходишь сквозь стены, летаешь по воздуху и т.д., то тебя засекут не сразу, а скажем, через пол часика. Это такой компромисный вариант между функциональностью и скорострельностью серверной части.
 Как конкретно реализована каждая игра - можно разобраться по траффику.
 |  
|  |  |  |  | Пусть сервак все рассылает без запросов.  30.10.08 14:36 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 Отредактировано 30.10.08 14:36  Количество правок: 1
 |  
| > Как вариант: избавится от логики запросов. 
 Пусть сервак все рассылает без запросов.
 
 > При этом сервер может даже не отслеживать положении
 > игроков, или отслеживать их на отдельном сервере не в
 > рилтайм режиме, с целью выискивания читтеров.
 > Например, если ты подменяешь стандартный игровой клиент
 > своей чит-программой, которая игнорирует карту, и проходишь
 > сквозь стены, летаешь по воздуху и т.д., то тебя засекут не
 
 Чтоб такого не было - вся игра идет на серваке, а клиенты посылают серваку сигналы управления (нажатия на кнопки и движения мышки). Сервак рассылает всем координаты и положения всех игроков и прочих подвижных предметов, которые находятся в пределах видимости.
 |  
|  |  |  |  |  | Не соглашусь с последним утверждением  31.10.08 11:35 Автор: PS <PS> Статус: Elderman
 |  
| > Чтоб такого не было - вся игра идет на серваке, а клиенты > посылают серваку сигналы управления (нажатия на кнопки и
 > движения мышки). Сервак рассылает всем координаты и
 > положения всех игроков и прочих подвижных предметов,
 > которые находятся в пределах видимости.
 
 Пусть у тебя играют 500000 человек. Количество зон в игре не важно, т.к. все зоны в пределах сервера обрабатываются одной машиной. Кроме людей есть еще мобы и игровые предметы. Количество мобов примем три на человека.
 Если ты решишь рассылать координаты всех подвижных участников игры: игроков и мобов, то тебе придется в рил-тайм обсчитывать полтора миллиона объектов. Причем не только их положение, но и зону видимости пол миллиона людей.
 Ничего не настораживает ?
 |  
|  |  |  |  |  |  | Эта какая игра сейчас позволяет иметь полмиллиона участников в одном мире? [upd]  31.10.08 20:05 Автор: amirul <Serge> Статус: The Elderman
 Отредактировано 31.10.08 20:12  Количество правок: 1
 |  
| > Пусть у тебя играют 500000 человек. Количество зон в игре > не важно, т.к. все зоны в пределах сервера обрабатываются
 > одной машиной. Кроме людей есть еще мобы и игровые
 Нет, не одной. Вполне можно сделать распределенную считалку с синхронизацией на швах.
 
 > предметы. Количество мобов примем три на человека.
 > Если ты решишь рассылать координаты всех подвижных
 > участников игры: игроков и мобов, то тебе придется в
 > рил-тайм обсчитывать полтора миллиона объектов. Причем не
 > только их положение, но и зону видимости пол миллиона
 > людей.
 
 Зону видимости можно только прикинуть - вместо обычной метрики sqrt(x^2 + y^2 + x^2) можно использовать метрикуx+y+z
 
 > Ничего не настораживает ?
 Ничего. Полтора миллиона объектов на сцене - вполне сопоставимо с числом полигонов в одном фрейме современной игрушки. Обсчитываются легко - рисовать то ничего не надо.
 
 ----------------------
 Вот здесь http://en.wikipedia.org/wiki/Comparison_of_MMORPGs пишут о нагрузке примерно 36к игроков на один сервер в WoW. И это не тот результат, которого когда либо сможет достичь синглдевелопер. Так что ориентироваться нужно в лучшем случае на 1-2к
 |  
|  |  |  |  |  |  | Написание в расчете на 5, 50 и 500000 игроков должно иметь несколько...  31.10.08 15:52 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 Отредактировано 31.10.08 15:54  Количество правок: 3
 |  
| > Пусть у тебя играют 500000 человек. Количество зон в игре 
 Написание в расчете на 5, 50 и 500000 игроков должно иметь несколько разный подход.
 Когда народа много (сомневаюсь, что активных плееров у Ведруса в игрушке достигет поллимона, но отрицать тоже нельзя), можно раскидывать народ по сервакам. Не обязательно всем в одной сцене/эпизоде/уровне участвовать.
 
 > не важно, т.к. все зоны в пределах сервера обрабатываются
 > одной машиной. Кроме людей есть еще мобы и игровые
 > предметы. Количество мобов примем три на человека.
 > Если ты решишь рассылать координаты всех подвижных
 > участников игры: игроков и мобов, то тебе придется в
 > рил-тайм обсчитывать полтора миллиона объектов. Причем не
 > только их положение, но и зону видимости пол миллиона
 > людей.
 > Ничего не настораживает ?
 
 Все зависит от узкого места. Если это вычислялка, а сетка сверхскоростная (80386 на гигабитке), то да, а если наоборот (многопроцовый многоядровый Коре2 на мегабитном интернете), то придется стараться уменьшать трафик.
 |  
|  |  |  |  |  |  | Настораживает  31.10.08 13:08 Автор: Heller <Heller> Статус: Elderman
 |  
| > Пусть у тебя играют 500000 человек. Количество зон в игре > не важно, т.к. все зоны в пределах сервера обрабатываются
 > одной машиной. Кроме людей есть еще мобы и игровые
 > предметы. Количество мобов примем три на человека.
 > Если ты решишь рассылать координаты всех подвижных
 > участников игры: игроков и мобов, то тебе придется в
 > рил-тайм обсчитывать полтора миллиона объектов. Причем не
 > только их положение, но и зону видимости пол миллиона
 > людей.
 > Ничего не настораживает ?
 Отправлять надо только то, что для конкретного клиента актуально. Однако настораживает меня именно твой вариант, а не DPP. Если пользователь будет сам сообщать какую информацию ему отдать, появляется широкое поле для читерства. Все равно решать что кому отдать должен сервер.
 |  
|  |  |  |  |  |  |  | Проблема читерства может быть решена другими способами  31.10.08 13:32 Автор: PS <PS> Статус: Elderman
 |  
| > Отправлять надо только то, что для конкретного клиента > актуально. Однако настораживает меня именно твой вариант, а
 > не DPP. Если пользователь будет сам сообщать какую
 > информацию ему отдать, появляется широкое поле для
 > читерства. Все равно решать что кому отдать должен сервер.
 
 Повторю еще раз: пол миллиона человек в online - высчитывать что для каждого из них актуально, а что нет - физически не возможно.
 Проблема читерства может быть решена другим способом: есть back сервер, на котором неспешно проверяются команды и состояния игроков. Сервера загружены не постоянно, в ночное время, и рабочее дневное - количество игроков много меньше чем с 18 до 24 по москве. Значит именно в ночное время back сервер будет "догонять" текущую ситуацию. При обнаружение читеров back просто блокирует данный аккаунт. Все читерские последствия отменяются (если возможно). Например из счетчика побед игроков, с которым сражался читер - исключаются поражения, связаные с этим читером.
 Так же в игре может быть предусмотрена команда: "Пожаловаться на читера".
 Ну и напоследок - не совсем прозрачные протоколы между клиентом и сервером (это так, от школьников).
 
 P.S. Такой алгоритм работы возможен для широкомаштабных игр, в которых люди проводят месяца или года (вряд ли кто пойдет ради выиграша одного двух боев на риск потерять персонажа на которого затрачено пол года сидения перед монитором). И совсем не подходит для локальных стрелялок (ну забанили твой аккаунт - завел новый и перестрелял всех). Однако в локальных стрелялках нет полу-миллионой аудитории :) А за 20ю человеками может и front последить в рил-тайме.
 |  
|  |  |  |  |  |  |  |  | Не вижу сложностей  31.10.08 15:11 Автор: Heller <Heller> Статус: Elderman
 |  
| > Повторю еще раз: пол миллиона человек в online - > высчитывать что для каждого из них актуально, а что нет -
 > физически не возможно.
 По-моему вполне возможно, главное грамотно локализовать данные (кластеризовать игроков или не знаю как правильнее сказать). Грубо говоря у тебя есть много локаций, и когда кто-то совершает некое действие, оно рассылается всем в пределах данной локации. Где сложности? А вот механизм с запрашиванием новых данных от сервера мне выглядит более трудоемким, причем ничем не упрощающим реализацию.
 
 Мне моя реализация видится так:
 Сервер - Игрок A двинулся в сектор Б.
 Клиент - Ок, понял.
 Сервер - Игрое Б замочил игрока Ц.
 Клиент - Ок, понял.
 
 Кому рассылать данные клиент решает просто пробегая по вектору игроков локации.
 
 Твоя реализация:
 Клиент - Ну че там, есть нового чо?
 Сервер - Не-а, нету :-(
 Клиент - Ну че там, есть нового чо?
 Сервер - Не-а, нету :-(
 Клиент - Ну че там, есть нового чо?
 Сервер - Да, А двинулся в Б, Б замочил Ц.
 Клиент - Ок, понял.
 Клиент - Ну че там, есть нового чо?
 
 Для реалтаймовой игрушки не особо скоростной подход получается даже на пальцах.
 |  
|  |  |  |  |  |  |  |  |  | Я уже ничего не понимаю, споришь ты со мной или соглашаешся...  01.11.08 13:37 Автор: PS <PS> Статус: Elderman
 |  
| > > Повторю еще раз: пол миллиона человек в online - > > высчитывать что для каждого из них актуально, а что
 > нет -
 > > физически не возможно.
 > По-моему вполне возможно, главное грамотно локализовать
 > данные (кластеризовать игроков или не знаю как правильнее
 > сказать). Грубо говоря у тебя есть много локаций, и когда
 > кто-то совершает некое действие, оно рассылается всем в
 > пределах данной локации. Где сложности? А вот механизм с
 > запрашиванием новых данных от сервера мне выглядит более
 > трудоемким, причем ничем не упрощающим реализацию.
 
 Я об этом и говорю - действие рассылается всем (в пределах локации, зоны, класстера - это все оптимизация траффика).
 
 Спор тут затевается о другом.
 Мое утверждение: front не должен следить за ПРАВИЛАМИ.
 Утверждение противоположной стороны: front должен рассылать данные только после необходимых проверок в их валидности.
 
 P.S. Опять же оговорюсь, что следует иметь ввиду масштаб игры.
 |  
|  |  |  |  |  |  |  |  |  | Можно и без подтверждения. Сам сетевой протокол...  31.10.08 16:01 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 Отредактировано 31.10.08 16:03  Количество правок: 3
 |  
| > Мне моя реализация видится так: > Сервер - Игрок A двинулся в сектор Б.
 > Клиент - Ок, понял.
 > Сервер - Игрое Б замочил игрока Ц.
 > Клиент - Ок, понял.
 
 Можно и без подтверждения. Сам сетевой протокол подразумевает гарантированность доставки.
 Сервер - Игрок A двинулся в сектор Б.
 Сервер - Игрое Б замочил игрока Ц.
 
 > Твоя реализация:
 > Клиент - Ну че там, есть нового чо?
 > Сервер - Не-а, нету :-(
 > Клиент - Ну че там, есть нового чо?
 > Сервер - Не-а, нету :-(
 > Клиент - Ну че там, есть нового чо?
 > Сервер - Да, А двинулся в Б, Б замочил Ц.
 > Клиент - Ок, понял.
 > Клиент - Ну че там, есть нового чо?
 
 А здесь без запросов нельзя. Хотя зачем они нужны, если на них все равно идет ответ "Не-а, нету :-(". Зачем пустой инфой каналы забивать. Ее же все равно еще и обрабатывать надо. Хочется своевременно получать инфу - надо пулить с бешенной частотой, но своевременность получения "по прерыванию" будет всегда своевременнее чем "по запросу".
 |  
|  |  |  |  | Лучше взять простенькую open source online multiplayer игру...  29.10.08 20:12 Автор: amirul <Serge> Статус: The Elderman
 |  
| > Как конкретно реализована каждая игра - можно разобраться > по траффику.
 Лучше взять простенькую open source online multiplayer игру и смотреть как это сделано у них. Первое, что пришло в голову:
 http://teeworlds.com/
 
 Очень хорошо модуляризовано, во всяком случае моды клепать довольно легко (сам я делал инстагиб, менял характеристики респавна и пр.), так что найти реализацию клиент-серверного протокола не составит труда. Игра довольно динамична, так что требования к протоколу жесткие.
 |  
|  |  |  |  | "В отличие от web, online игра должна реагировать очень...  29.10.08 18:25 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 |  
| "В отличие от web, online игра должна реагировать очень быстро. А пока клиент прочухается, пока отошлет запрос, пока сервер отработает пол миллиона запросов - ты, как игрок, уснешь перед монитором. Как вариант: избавится от логики запросов. "
 Может есть, что почитать по этому поводу? Я так понял, нужно игнорируя Apache свой сервер писать и ставить в идеале?
 |  
|  | А что тут еще можно придумать... Можно еще учитывать вектор...  29.10.08 17:03 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
 |  
| > То, что придумал я – это несколько раз в секунду опрашивать > сервер о текущем состоянии сцены и на основе полученных
 
 А что тут еще можно придумать... Можно еще учитывать вектор скорости - величину и направление. Время так же надо синхронизировать. Это чтоб побороть латентность канала.
 
 > данных прорисовывать сцену. Но такой вариант трафика и
 > других ресурсов очень много жрать будет.
 
 Какой трафик, какие ресурсы, десяток байт на опрос, десять опросов в секунду, сотня байт в секунду, килобит в секунду, да хоть в десять раз больше - десять килобит, такой трафик любой модем на коммутируемых линиях потянет.
 |  
|  |  | Ну оптимизация всё равно не повредит. 10 байт это на один движущийся объект. А если их сотня в одной сцене движется. Да и сервер наверно загудит, если 10 раз в секунду запросы к БД отсылать. Или я не прав?  29.10.08 17:50 Автор: Vedrus <Serokhvostov Anton> Статус: Member
 Отредактировано 29.10.08 18:03  Количество правок: 1
 |  
|  |  
 
 
 |  |