forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Сеть (http://forum.boolean.name/showthread.php?t=17766)

pax 18.01.2013 00:37

Сеть
 
В общем задался вопросом про сетевое предсказание. Есть ли какие-то простые решения этого вопроса, или просто надо решать СЛАУ на несколько последних данных? Не хочется на данном этапе сильно заморачиваться.

Буду благодарен ссылкам на чтиво с простыми решениями и сложными.

jimon 18.01.2013 01:41

Ответ: Сеть
 
смотря какие у тебя данные, если чисто движение то нужно просто экстраполировать данные и блендить это с приходящими данными постоянно

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

ps. реалтайм сеть это самое сложное в геймдеве, разве в юнити нет готового решения ? :) если нет то советую даже не пытатся :) ведь придет кто-то с пингом 1 - 2 сек и ваши идеи\конфиги зафейлятся

moka 18.01.2013 01:54

Ответ: Сеть
 
Учитывая что у тебя мультплеер с летящими пулями, то если пули летят не слишком быстро, можно и интерполяцией обойтись. НО, тут нужно тогда на сервере учитывать стрельбу в прошлом и это порой геморойней сказывается.

Поэтому лучше всего это экстраполировать. Тем более что у тебя чистой воды взаимодействие с другими игроками, так что экстраполяция - musthave.

Экстраполировать нужно на промежуток времени вперёд, равный твоему пингу пингу самого клиента. Таким клиент будет стараться симулировать состояние в мире идентичное как в реальный момент на сервере.
Самого же себя нужно управлять напрямую, НО. Используя начальную задержку. Короче нужно сперва экстраполировать личные данные, и если они сильно не расходятся с теми что пользователь пытается применить вводом - разрешать применять. Иначе смешивать плавно с экстраполируемой. Это исправит сильные ошибки из-за лагов. Также вначале движения, т.к. игрок стоит ещё на клиенте, и сервер не начал идти, а клиент уже выдал инпут - следственно его инпут будет применяться лишь частично, будет эффект разгона игрока.
Это нужно тупо потому что сервер получит данные позже, и начнёт двигать игрока позже, следственно мы не можем сразу бежать быстро.

Про стрельбу, тут очень важно правильно экстраполировать на клиентах. Если это сделано честно, то и игрок будет стрелять честно.

Скорость пули нужна достаточно быстрая.
Но есть тут правда одна зацепка, при больших лагах, команда о выстреле дойдёт до сервера намного позже, и тем самым не попадёт.

Поэтому нужно реализовывать машину времени на сервере.
Которая в случае с выстрелами будет делать такой ход: Клиент прислал запрос на выстрел. Сервер идёт назад на промежуток времени равный пингу клиента, и проверяет если клиент мог тогда выстрелить, если да, то стреляет тогда, затем проверяет не попал ли ни в кого между тем где был, и сейчас. Если нет, то пуля создаётся уже с учётом прошедшего времени от начала выстрела в прошлом, то есть она будет впереди.

Также есть такая тема с парадоксами. Например КлиентА с пингом 50, выстрелил фатальный в КлиентВ на момент игры 1000 мс. А КлиентБ с пингом 150 выстрелил фатальный в КлиентВ на момент игры 950мс.
КлиентБ по сути должен быть тот кто убил, т.к. реально выстрелил раньше.
Но сервер получит выстрел от КлиентА на момент 1050, и убьёт КлиентВ. И лишь потом на момент 1100 получит пакет от КлиентБ, пойдёт в прошлое стрелять, и окажется он убил КлиентВ раньше чем КлиентА.
И тут дилемма как поступить.
Простейший вариант - это сообщать что КлиентВ мёртв. Но награждать убийцу и сообщать кто убил нужно по протяжению максимальной задержки машины времени. Например 500мс. Таким образом будет в разы честнее. Это относится не только к выстрелам.

Только так можно сделать Честную игру, где не будет приоритета игрокам с лагами и без.

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

То что описал выше, называется Optimistic Consistency. Есть ещё пессимистичная консистенция, это интерполяция, и много прошлого на сервере.
Для Action-like нужна экстраполяция, т.к. с пессимистичной моделью у тебя задержка будет ужасной..

Кстати какой у тебя UPS (Update Per Second) на сервере?

pax 18.01.2013 22:20

Ответ: Сеть
 
Спасибо подумаю. Сервер один из клиентов, он управляет только статистикой и захватом баз. Клиенты каждый обрабатывает сам себя. Вся логика естественно на клиенте. Из сказанного тобой я понял что мне нужно предсказать только поворот игрока, а точнее не предсказать, а передавать сразу с экстраполяцией на щаг вперед. Я думаю этого будет достаточно на первое время. Летящие пули это только эффекты. UPS = 10.

moka 18.01.2013 22:37

Ответ: Сеть
 
Поворот не нужно экстраполировать, хватит интерполяции.
А положение - нужно экстраполировать. Предсказание нужно делать используя кубические сплайны - если хочешь хорошего результата.

Но даже можно тупо взять прошлую точку, текущую точку - получаем вектор. Нормализуем. Далее берём задержку * скорость перемещения (тут нужен коэфицент), таким образом знаем на сколько далеко тебе нужно предсказать положение игрока. Умножаем ранее полученный вектор на эту длину, прибавляем последнюю позицию - вот вам и предсказанная позиция. У тебя простой WASD, не играл, но как понимаю у тебя нету сглаживания перемещения? Обычно это не сильно влияет на предсказание таким методом влоб.

Далее двигаешь игроков к предсказанной точке, немного ускоряя если расстояние между точкой и игроком больше чем задержка * скорость.
Чтобы компенсировать шанс нарастания ошибки.

pax 18.01.2013 22:49

Ответ: Сеть
 
Сейчас простая интерполяция к последнему полученному значению. Мне надо экстраполировать поворот и передавать его предсказанный остальным. Мне этого хватит. Сейчас основная видимая ошибка, что пули летят пока в другую сторону, а тебя успевают убить. Выглядит немного не естественно. Если поворот будет передан на шаг вперед, то хотя бы он будет немного это компенсировать, меня на данном этапе это устроит.

moka 18.01.2013 23:10

Ответ: Сеть
 
Зачем поворот, если пули не должны от него зависеть.
Или у тебя передаётся состояние "стреляет" / "не стреляет"? Если так, то да, нужен поворот.
Если нет, то всё что нужно это передовать вектор выстрела, клиент же получая выстрел его просто симулирует по вектору.

pax 18.01.2013 23:12

Ответ: Сеть
 
Да, передается состояние стрельбы. Если передавать вектор выстрела и не экстраполировать поворот - то ничего не изменится. Вектор выстрела совпадает с поворотом игрока.

moka 19.01.2013 02:11

Ответ: Сеть
 
Так игрок же знает свой поворот. Делает выстрел например на 90 градусов. Сервер получает эти 90 градусов. Отдаёт другим клиентам. У них градус не меняется, как стреляющий, сервер так и остальные клиенты будут на 90 градусов стрелять.
Ничего экстраполировать не нужно..

pax 20.01.2013 00:57

Ответ: Сеть
 
"Сервер" - один из клиентов, а облако фотона просто доставляет пакеты. Каждый игрок передает всем свою позицию и состояние. "Сервер" перемещение не контролирует. Он считает только прогресс захвата баз и синхронизирует со всеми, если "сервер" выходит, один из игроков становится новым сервером и продолжает его работу. Вся логика на клиенте.

moka 20.01.2013 05:29

Ответ: Сеть
 
Уф. Ну у тебя будут тут проблемы тогда серьёзные - во первых с синхронизацией, тебе будет сложнее её в разы сделать честной.
Далее читерство - тут уж прости, но с такой моделью они нагрянут ОЧЕНЬ быстро. Т.к. клиент - решает, следственно и решения его могут быть фальсифицированными. Жди спиидхаки, бессмертия, убийцы всего и вся.

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

Ты лучше скажи - у тебя серьёзные планы насчёт данного проекта, или это тестовый ход для самообучения, опыта и проверки идей и теорий?

pax 20.01.2013 12:19

Ответ: Сеть
 
Читерство меня не волнует, с облаком проще, потому что не надо иметь своих серверов. Доставку пакетов берет на себя облако. В итоге платить за количество пользователей. https://cloud.exitgames.com/Pricing

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

jimon 20.01.2013 16:10

Ответ: Сеть
 
pax
если тебя читеры не волнуют то втф ? такую сеть можно за полчаса правой ногой написать

pax 20.01.2013 17:45

Ответ: Сеть
 
Волнует максимальный трафик. Сейчас я более чем в два раза превысил число разрешенных на Indie плане сообщений. Плюс если ты читал - архитектура такая, что нет авторитарного сервера. С этим тоже есть своего рода геморрой. Короче в данное теме я получил нужные мне сведения, спасибо всем.

Phantom 16.08.2013 10:58

Ответ: Сеть
 
Делаешь что-то вроде Батлы или Квейка?


Часовой пояс GMT +4, время: 02:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot