Сеть
В общем задался вопросом про сетевое предсказание. Есть ли какие-то простые решения этого вопроса, или просто надо решать СЛАУ на несколько последних данных? Не хочется на данном этапе сильно заморачиваться.
Буду благодарен ссылкам на чтиво с простыми решениями и сложными. |
Ответ: Сеть
смотря какие у тебя данные, если чисто движение то нужно просто экстраполировать данные и блендить это с приходящими данными постоянно
проблема в том что настроить везде коеф. всего очень сложно, насколько времени в будущем должен быть сервер ? насколько надо экстраполировать ? насколько хранить тайм-стампы в прошлое на сервере ? ведь по-сути у всех клиентов в одно время разная картинка на экране, и с этим придется мирится и это придется настраивать ps. реалтайм сеть это самое сложное в геймдеве, разве в юнити нет готового решения ? :) если нет то советую даже не пытатся :) ведь придет кто-то с пингом 1 - 2 сек и ваши идеи\конфиги зафейлятся |
Ответ: Сеть
Учитывая что у тебя мультплеер с летящими пулями, то если пули летят не слишком быстро, можно и интерполяцией обойтись. НО, тут нужно тогда на сервере учитывать стрельбу в прошлом и это порой геморойней сказывается.
Поэтому лучше всего это экстраполировать. Тем более что у тебя чистой воды взаимодействие с другими игроками, так что экстраполяция - musthave. Экстраполировать нужно на промежуток времени вперёд, равный твоему пингу пингу самого клиента. Таким клиент будет стараться симулировать состояние в мире идентичное как в реальный момент на сервере. Самого же себя нужно управлять напрямую, НО. Используя начальную задержку. Короче нужно сперва экстраполировать личные данные, и если они сильно не расходятся с теми что пользователь пытается применить вводом - разрешать применять. Иначе смешивать плавно с экстраполируемой. Это исправит сильные ошибки из-за лагов. Также вначале движения, т.к. игрок стоит ещё на клиенте, и сервер не начал идти, а клиент уже выдал инпут - следственно его инпут будет применяться лишь частично, будет эффект разгона игрока. Это нужно тупо потому что сервер получит данные позже, и начнёт двигать игрока позже, следственно мы не можем сразу бежать быстро. Про стрельбу, тут очень важно правильно экстраполировать на клиентах. Если это сделано честно, то и игрок будет стрелять честно. Скорость пули нужна достаточно быстрая. Но есть тут правда одна зацепка, при больших лагах, команда о выстреле дойдёт до сервера намного позже, и тем самым не попадёт. Поэтому нужно реализовывать машину времени на сервере. Которая в случае с выстрелами будет делать такой ход: Клиент прислал запрос на выстрел. Сервер идёт назад на промежуток времени равный пингу клиента, и проверяет если клиент мог тогда выстрелить, если да, то стреляет тогда, затем проверяет не попал ли ни в кого между тем где был, и сейчас. Если нет, то пуля создаётся уже с учётом прошедшего времени от начала выстрела в прошлом, то есть она будет впереди. Также есть такая тема с парадоксами. Например КлиентА с пингом 50, выстрелил фатальный в КлиентВ на момент игры 1000 мс. А КлиентБ с пингом 150 выстрелил фатальный в КлиентВ на момент игры 950мс. КлиентБ по сути должен быть тот кто убил, т.к. реально выстрелил раньше. Но сервер получит выстрел от КлиентА на момент 1050, и убьёт КлиентВ. И лишь потом на момент 1100 получит пакет от КлиентБ, пойдёт в прошлое стрелять, и окажется он убил КлиентВ раньше чем КлиентА. И тут дилемма как поступить. Простейший вариант - это сообщать что КлиентВ мёртв. Но награждать убийцу и сообщать кто убил нужно по протяжению максимальной задержки машины времени. Например 500мс. Таким образом будет в разы честнее. Это относится не только к выстрелам. Только так можно сделать Честную игру, где не будет приоритета игрокам с лагами и без. Но для начала, просто реализуй дельную экстраполяцию на время пинга. Тебе нужны кубические сплайны. То что описал выше, называется Optimistic Consistency. Есть ещё пессимистичная консистенция, это интерполяция, и много прошлого на сервере. Для Action-like нужна экстраполяция, т.к. с пессимистичной моделью у тебя задержка будет ужасной.. Кстати какой у тебя UPS (Update Per Second) на сервере? |
Ответ: Сеть
Спасибо подумаю. Сервер один из клиентов, он управляет только статистикой и захватом баз. Клиенты каждый обрабатывает сам себя. Вся логика естественно на клиенте. Из сказанного тобой я понял что мне нужно предсказать только поворот игрока, а точнее не предсказать, а передавать сразу с экстраполяцией на щаг вперед. Я думаю этого будет достаточно на первое время. Летящие пули это только эффекты. UPS = 10.
|
Ответ: Сеть
Поворот не нужно экстраполировать, хватит интерполяции.
А положение - нужно экстраполировать. Предсказание нужно делать используя кубические сплайны - если хочешь хорошего результата. Но даже можно тупо взять прошлую точку, текущую точку - получаем вектор. Нормализуем. Далее берём задержку * скорость перемещения (тут нужен коэфицент), таким образом знаем на сколько далеко тебе нужно предсказать положение игрока. Умножаем ранее полученный вектор на эту длину, прибавляем последнюю позицию - вот вам и предсказанная позиция. У тебя простой WASD, не играл, но как понимаю у тебя нету сглаживания перемещения? Обычно это не сильно влияет на предсказание таким методом влоб. Далее двигаешь игроков к предсказанной точке, немного ускоряя если расстояние между точкой и игроком больше чем задержка * скорость. Чтобы компенсировать шанс нарастания ошибки. |
Ответ: Сеть
Сейчас простая интерполяция к последнему полученному значению. Мне надо экстраполировать поворот и передавать его предсказанный остальным. Мне этого хватит. Сейчас основная видимая ошибка, что пули летят пока в другую сторону, а тебя успевают убить. Выглядит немного не естественно. Если поворот будет передан на шаг вперед, то хотя бы он будет немного это компенсировать, меня на данном этапе это устроит.
|
Ответ: Сеть
Зачем поворот, если пули не должны от него зависеть.
Или у тебя передаётся состояние "стреляет" / "не стреляет"? Если так, то да, нужен поворот. Если нет, то всё что нужно это передовать вектор выстрела, клиент же получая выстрел его просто симулирует по вектору. |
Ответ: Сеть
Да, передается состояние стрельбы. Если передавать вектор выстрела и не экстраполировать поворот - то ничего не изменится. Вектор выстрела совпадает с поворотом игрока.
|
Ответ: Сеть
Так игрок же знает свой поворот. Делает выстрел например на 90 градусов. Сервер получает эти 90 градусов. Отдаёт другим клиентам. У них градус не меняется, как стреляющий, сервер так и остальные клиенты будут на 90 градусов стрелять.
Ничего экстраполировать не нужно.. |
Ответ: Сеть
"Сервер" - один из клиентов, а облако фотона просто доставляет пакеты. Каждый игрок передает всем свою позицию и состояние. "Сервер" перемещение не контролирует. Он считает только прогресс захвата баз и синхронизирует со всеми, если "сервер" выходит, один из игроков становится новым сервером и продолжает его работу. Вся логика на клиенте.
|
Ответ: Сеть
Уф. Ну у тебя будут тут проблемы тогда серьёзные - во первых с синхронизацией, тебе будет сложнее её в разы сделать честной.
Далее читерство - тут уж прости, но с такой моделью они нагрянут ОЧЕНЬ быстро. Т.к. клиент - решает, следственно и решения его могут быть фальсифицированными. Жди спиидхаки, бессмертия, убийцы всего и вся. Единственный плюс в такой модели - нагрузка идёт на клиентов, а не на сервер, таким образом хостинг будет делом не дорогим. Но у тебя всё равно будут на это нормальные затраты, тем более если все захотят поиграть, передать им столько траффика ты просто физически не сможешь, тебе понадобиться CDN - и это будет стоить копеечку. Ты лучше скажи - у тебя серьёзные планы насчёт данного проекта, или это тестовый ход для самообучения, опыта и проверки идей и теорий? |
Ответ: Сеть
Читерство меня не волнует, с облаком проще, потому что не надо иметь своих серверов. Доставку пакетов берет на себя облако. В итоге платить за количество пользователей. https://cloud.exitgames.com/Pricing
Планы такие - хотел на следующей неделе отправить на проверку администрации вконтакта, если одобрят и пользователи начнут играть - арендую для начала 100CCU, дальнейшее развитие будет видно. Если пойдет, то продолжу развивать проект, если нет, то это будет хорошим опытом. Прогресс сохраняется будет через php. |
Ответ: Сеть
pax
если тебя читеры не волнуют то втф ? такую сеть можно за полчаса правой ногой написать |
Ответ: Сеть
Волнует максимальный трафик. Сейчас я более чем в два раза превысил число разрешенных на Indie плане сообщений. Плюс если ты читал - архитектура такая, что нет авторитарного сервера. С этим тоже есть своего рода геморрой. Короче в данное теме я получил нужные мне сведения, спасибо всем.
|
Ответ: Сеть
Делаешь что-то вроде Батлы или Квейка?
|
Часовой пояс GMT +4, время: 02:18. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot