|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
18.01.2013, 00:37
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Сеть
В общем задался вопросом про сетевое предсказание. Есть ли какие-то простые решения этого вопроса, или просто надо решать СЛАУ на несколько последних данных? Не хочется на данном этапе сильно заморачиваться.
Буду благодарен ссылкам на чтиво с простыми решениями и сложными.
|
(Offline)
|
|
18.01.2013, 01:41
|
#2
|
|
Ответ: Сеть
смотря какие у тебя данные, если чисто движение то нужно просто экстраполировать данные и блендить это с приходящими данными постоянно
проблема в том что настроить везде коеф. всего очень сложно, насколько времени в будущем должен быть сервер ? насколько надо экстраполировать ? насколько хранить тайм-стампы в прошлое на сервере ? ведь по-сути у всех клиентов в одно время разная картинка на экране, и с этим придется мирится и это придется настраивать
ps. реалтайм сеть это самое сложное в геймдеве, разве в юнити нет готового решения ? если нет то советую даже не пытатся ведь придет кто-то с пингом 1 - 2 сек и ваши идеи\конфиги зафейлятся
|
|
|
Сообщение было полезно следующим пользователям:
|
|
18.01.2013, 01:54
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сеть
Учитывая что у тебя мультплеер с летящими пулями, то если пули летят не слишком быстро, можно и интерполяцией обойтись. НО, тут нужно тогда на сервере учитывать стрельбу в прошлом и это порой геморойней сказывается.
Поэтому лучше всего это экстраполировать. Тем более что у тебя чистой воды взаимодействие с другими игроками, так что экстраполяция - musthave.
Экстраполировать нужно на промежуток времени вперёд, равный твоему пингу пингу самого клиента. Таким клиент будет стараться симулировать состояние в мире идентичное как в реальный момент на сервере.
Самого же себя нужно управлять напрямую, НО. Используя начальную задержку. Короче нужно сперва экстраполировать личные данные, и если они сильно не расходятся с теми что пользователь пытается применить вводом - разрешать применять. Иначе смешивать плавно с экстраполируемой. Это исправит сильные ошибки из-за лагов. Также вначале движения, т.к. игрок стоит ещё на клиенте, и сервер не начал идти, а клиент уже выдал инпут - следственно его инпут будет применяться лишь частично, будет эффект разгона игрока.
Это нужно тупо потому что сервер получит данные позже, и начнёт двигать игрока позже, следственно мы не можем сразу бежать быстро.
Про стрельбу, тут очень важно правильно экстраполировать на клиентах. Если это сделано честно, то и игрок будет стрелять честно.
Скорость пули нужна достаточно быстрая.
Но есть тут правда одна зацепка, при больших лагах, команда о выстреле дойдёт до сервера намного позже, и тем самым не попадёт.
Поэтому нужно реализовывать машину времени на сервере.
Которая в случае с выстрелами будет делать такой ход: Клиент прислал запрос на выстрел. Сервер идёт назад на промежуток времени равный пингу клиента, и проверяет если клиент мог тогда выстрелить, если да, то стреляет тогда, затем проверяет не попал ли ни в кого между тем где был, и сейчас. Если нет, то пуля создаётся уже с учётом прошедшего времени от начала выстрела в прошлом, то есть она будет впереди.
Также есть такая тема с парадоксами. Например КлиентА с пингом 50, выстрелил фатальный в КлиентВ на момент игры 1000 мс. А КлиентБ с пингом 150 выстрелил фатальный в КлиентВ на момент игры 950мс.
КлиентБ по сути должен быть тот кто убил, т.к. реально выстрелил раньше.
Но сервер получит выстрел от КлиентА на момент 1050, и убьёт КлиентВ. И лишь потом на момент 1100 получит пакет от КлиентБ, пойдёт в прошлое стрелять, и окажется он убил КлиентВ раньше чем КлиентА.
И тут дилемма как поступить.
Простейший вариант - это сообщать что КлиентВ мёртв. Но награждать убийцу и сообщать кто убил нужно по протяжению максимальной задержки машины времени. Например 500мс. Таким образом будет в разы честнее. Это относится не только к выстрелам.
Только так можно сделать Честную игру, где не будет приоритета игрокам с лагами и без.
Но для начала, просто реализуй дельную экстраполяцию на время пинга. Тебе нужны кубические сплайны.
То что описал выше, называется Optimistic Consistency. Есть ещё пессимистичная консистенция, это интерполяция, и много прошлого на сервере.
Для Action-like нужна экстраполяция, т.к. с пессимистичной моделью у тебя задержка будет ужасной..
Кстати какой у тебя UPS (Update Per Second) на сервере?
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
18.01.2013, 22:20
|
#4
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сеть
Спасибо подумаю. Сервер один из клиентов, он управляет только статистикой и захватом баз. Клиенты каждый обрабатывает сам себя. Вся логика естественно на клиенте. Из сказанного тобой я понял что мне нужно предсказать только поворот игрока, а точнее не предсказать, а передавать сразу с экстраполяцией на щаг вперед. Я думаю этого будет достаточно на первое время. Летящие пули это только эффекты. UPS = 10.
|
(Offline)
|
|
18.01.2013, 22:37
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сеть
Поворот не нужно экстраполировать, хватит интерполяции.
А положение - нужно экстраполировать. Предсказание нужно делать используя кубические сплайны - если хочешь хорошего результата.
Но даже можно тупо взять прошлую точку, текущую точку - получаем вектор. Нормализуем. Далее берём задержку * скорость перемещения (тут нужен коэфицент), таким образом знаем на сколько далеко тебе нужно предсказать положение игрока. Умножаем ранее полученный вектор на эту длину, прибавляем последнюю позицию - вот вам и предсказанная позиция. У тебя простой WASD, не играл, но как понимаю у тебя нету сглаживания перемещения? Обычно это не сильно влияет на предсказание таким методом влоб.
Далее двигаешь игроков к предсказанной точке, немного ускоряя если расстояние между точкой и игроком больше чем задержка * скорость.
Чтобы компенсировать шанс нарастания ошибки.
|
(Offline)
|
|
18.01.2013, 22:49
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сеть
Сейчас простая интерполяция к последнему полученному значению. Мне надо экстраполировать поворот и передавать его предсказанный остальным. Мне этого хватит. Сейчас основная видимая ошибка, что пули летят пока в другую сторону, а тебя успевают убить. Выглядит немного не естественно. Если поворот будет передан на шаг вперед, то хотя бы он будет немного это компенсировать, меня на данном этапе это устроит.
|
(Offline)
|
|
18.01.2013, 23:10
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сеть
Зачем поворот, если пули не должны от него зависеть.
Или у тебя передаётся состояние "стреляет" / "не стреляет"? Если так, то да, нужен поворот.
Если нет, то всё что нужно это передовать вектор выстрела, клиент же получая выстрел его просто симулирует по вектору.
|
(Offline)
|
|
18.01.2013, 23:12
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сеть
Да, передается состояние стрельбы. Если передавать вектор выстрела и не экстраполировать поворот - то ничего не изменится. Вектор выстрела совпадает с поворотом игрока.
|
(Offline)
|
|
19.01.2013, 02:11
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сеть
Так игрок же знает свой поворот. Делает выстрел например на 90 градусов. Сервер получает эти 90 градусов. Отдаёт другим клиентам. У них градус не меняется, как стреляющий, сервер так и остальные клиенты будут на 90 градусов стрелять.
Ничего экстраполировать не нужно..
|
(Offline)
|
|
20.01.2013, 00:57
|
#10
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сеть
"Сервер" - один из клиентов, а облако фотона просто доставляет пакеты. Каждый игрок передает всем свою позицию и состояние. "Сервер" перемещение не контролирует. Он считает только прогресс захвата баз и синхронизирует со всеми, если "сервер" выходит, один из игроков становится новым сервером и продолжает его работу. Вся логика на клиенте.
|
(Offline)
|
|
20.01.2013, 05:29
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сеть
Уф. Ну у тебя будут тут проблемы тогда серьёзные - во первых с синхронизацией, тебе будет сложнее её в разы сделать честной.
Далее читерство - тут уж прости, но с такой моделью они нагрянут ОЧЕНЬ быстро. Т.к. клиент - решает, следственно и решения его могут быть фальсифицированными. Жди спиидхаки, бессмертия, убийцы всего и вся.
Единственный плюс в такой модели - нагрузка идёт на клиентов, а не на сервер, таким образом хостинг будет делом не дорогим. Но у тебя всё равно будут на это нормальные затраты, тем более если все захотят поиграть, передать им столько траффика ты просто физически не сможешь, тебе понадобиться CDN - и это будет стоить копеечку.
Ты лучше скажи - у тебя серьёзные планы насчёт данного проекта, или это тестовый ход для самообучения, опыта и проверки идей и теорий?
|
(Offline)
|
|
20.01.2013, 12:19
|
#12
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сеть
Читерство меня не волнует, с облаком проще, потому что не надо иметь своих серверов. Доставку пакетов берет на себя облако. В итоге платить за количество пользователей. https://cloud.exitgames.com/Pricing
Планы такие - хотел на следующей неделе отправить на проверку администрации вконтакта, если одобрят и пользователи начнут играть - арендую для начала 100CCU, дальнейшее развитие будет видно. Если пойдет, то продолжу развивать проект, если нет, то это будет хорошим опытом. Прогресс сохраняется будет через php.
|
(Offline)
|
|
20.01.2013, 16:10
|
#13
|
|
Ответ: Сеть
pax
если тебя читеры не волнуют то втф ? такую сеть можно за полчаса правой ногой написать
|
|
|
20.01.2013, 17:45
|
#14
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сеть
Волнует максимальный трафик. Сейчас я более чем в два раза превысил число разрешенных на Indie плане сообщений. Плюс если ты читал - архитектура такая, что нет авторитарного сервера. С этим тоже есть своего рода геморрой. Короче в данное теме я получил нужные мне сведения, спасибо всем.
|
(Offline)
|
|
16.08.2013, 10:58
|
#15
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Сеть
Делаешь что-то вроде Батлы или Квейка?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:43.
|