Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 18.01.2013, 00:37   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Сеть

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

Буду благодарен ссылкам на чтиво с простыми решениями и сложными.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.01.2013, 01:41   #2
jimon
 
Сообщений: n/a
Ответ: Сеть

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

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

ps. реалтайм сеть это самое сложное в геймдеве, разве в юнити нет готового решения ? если нет то советую даже не пытатся ведь придет кто-то с пингом 1 - 2 сек и ваши идеи\конфиги зафейлятся
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (29.01.2013)
Старый 18.01.2013, 01:54   #3
moka
.
 
Регистрация: 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 за это полезное сообщение:
HolyDel (19.01.2013), nil0q (18.01.2013), pax (18.01.2013), Phantom (16.08.2013), St_AnGer (18.01.2013)
Старый 18.01.2013, 22:20   #4
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сеть

Спасибо подумаю. Сервер один из клиентов, он управляет только статистикой и захватом баз. Клиенты каждый обрабатывает сам себя. Вся логика естественно на клиенте. Из сказанного тобой я понял что мне нужно предсказать только поворот игрока, а точнее не предсказать, а передавать сразу с экстраполяцией на щаг вперед. Я думаю этого будет достаточно на первое время. Летящие пули это только эффекты. UPS = 10.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.01.2013, 22:37   #5
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Сеть

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

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

Далее двигаешь игроков к предсказанной точке, немного ускоряя если расстояние между точкой и игроком больше чем задержка * скорость.
Чтобы компенсировать шанс нарастания ошибки.
(Offline)
 
Ответить с цитированием
Старый 18.01.2013, 22:49   #6
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сеть

Сейчас простая интерполяция к последнему полученному значению. Мне надо экстраполировать поворот и передавать его предсказанный остальным. Мне этого хватит. Сейчас основная видимая ошибка, что пули летят пока в другую сторону, а тебя успевают убить. Выглядит немного не естественно. Если поворот будет передан на шаг вперед, то хотя бы он будет немного это компенсировать, меня на данном этапе это устроит.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.01.2013, 23:10   #7
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Сеть

Зачем поворот, если пули не должны от него зависеть.
Или у тебя передаётся состояние "стреляет" / "не стреляет"? Если так, то да, нужен поворот.
Если нет, то всё что нужно это передовать вектор выстрела, клиент же получая выстрел его просто симулирует по вектору.
(Offline)
 
Ответить с цитированием
Старый 18.01.2013, 23:12   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сеть

Да, передается состояние стрельбы. Если передавать вектор выстрела и не экстраполировать поворот - то ничего не изменится. Вектор выстрела совпадает с поворотом игрока.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 19.01.2013, 02:11   #9
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Сеть

Так игрок же знает свой поворот. Делает выстрел например на 90 градусов. Сервер получает эти 90 градусов. Отдаёт другим клиентам. У них градус не меняется, как стреляющий, сервер так и остальные клиенты будут на 90 градусов стрелять.
Ничего экстраполировать не нужно..
(Offline)
 
Ответить с цитированием
Старый 20.01.2013, 00:57   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сеть

"Сервер" - один из клиентов, а облако фотона просто доставляет пакеты. Каждый игрок передает всем свою позицию и состояние. "Сервер" перемещение не контролирует. Он считает только прогресс захвата баз и синхронизирует со всеми, если "сервер" выходит, один из игроков становится новым сервером и продолжает его работу. Вся логика на клиенте.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.01.2013, 05:29   #11
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Сеть

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

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

Ты лучше скажи - у тебя серьёзные планы насчёт данного проекта, или это тестовый ход для самообучения, опыта и проверки идей и теорий?
(Offline)
 
Ответить с цитированием
Старый 20.01.2013, 12:19   #12
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сеть

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

Планы такие - хотел на следующей неделе отправить на проверку администрации вконтакта, если одобрят и пользователи начнут играть - арендую для начала 100CCU, дальнейшее развитие будет видно. Если пойдет, то продолжу развивать проект, если нет, то это будет хорошим опытом. Прогресс сохраняется будет через php.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.01.2013, 16:10   #13
jimon
 
Сообщений: n/a
Ответ: Сеть

pax
если тебя читеры не волнуют то втф ? такую сеть можно за полчаса правой ногой написать
 
Ответить с цитированием
Старый 20.01.2013, 17:45   #14
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сеть

Волнует максимальный трафик. Сейчас я более чем в два раза превысил число разрешенных на Indie плане сообщений. Плюс если ты читал - архитектура такая, что нет авторитарного сервера. С этим тоже есть своего рода геморрой. Короче в данное теме я получил нужные мне сведения, спасибо всем.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 16.08.2013, 10:58   #15
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: Сеть

Делаешь что-то вроде Батлы или Квейка?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com