Search
Write a publication
Pull to refresh

Comments 75

UFO landed and left these words here
Да, двигаются всегда плавно, однако это как раз испортило столкновения. Машины будто бы «на рельсах» и очень часто их невозможно сдвинуть с места, потому что на самом деле машины стоят немного «не там», где должны, из-за чего по сути «жертва» видит, как в метре от нее проносится и останавливается на невидимом для нее препятствии (на ней самой) соперник. Спидбрейкер отключен, да.
для разных машин нужны разные апдейт-рейты в зависимости от расстояния до других машин, посчитать расстояние не сложно.
Т.е. чем ближе одна машина к другой, тем больше-чаще пакеты?
да, именно а еще есть смысл брать во внимание куда направлена камера (тот же принцип что используется для прорисовки графики). Конечно если есть возможность получать такие данные с клиента.
Так вот почему в гонках нет свободного обзора мышью =)
не помню, в этой игре можно отключить столкновения или нет?
Чисто физически можно, потому что там есть определенное состояние автомобиля, когда он может проезжать сквозь траффик / соперников, но не стены.

В мультиплеере со столкновениями вообще никто не играл никогда.
я про это и говорю, легче убрать вообще столкновения и не мучатся
Нереалистично. Я потому и ненавидел официальный онлайн — легальные какие-то гонки, нет трафика, нет столкновений, ничего!
это фактически вынужденная мера. физику тяжело передавать по сети. Небольшой затуп, большая рассинхронизация и из-за того что человек видит не то что на самом деле — делает не то что нужно, это ужасно бесит когда не ты виноват в косяке
Знаю. В одном из видео, кстати, это и случилось — посреди гонки мой соперник немного рассинхронизировался и на моей стороне просто развернул меня на 90 градусов вправо, из-за чего я подлетел на кочке и врезался в будку платной дороги (tollbooth), из-за чего перевернулся и проиграл гонку.
И, наконец, разделение [синхронизации] координат и скоростей, реально рабочее решение.
Принцип Гейзенберга в действии.
Добавили бы видео, как это работает, было бы круто
За рекламу же сочтут. Я потому даже имя не разглашал.
Куча шлака сыпет ссылками с первого предложения, а годнота боится сказать название из-за того, что «За рекламу же сочтут»
Передавайте привет SpeedyHeart, что ли. Вдруг порадуется :)

Работал он довольно просто: клиенты отправляли свои координаты, сервер их отправлял остальным, те на своей стороне присваивали их к машинам.

Надеюсь на лучшее, но все же спрошу: это так и оставили, или все-таки переписали? И планируете ли переписывать, если вдруг?
Переписали. Кстати, я именно вас звал в конце статьи, просто имя забыл. В Discord мне напишите: osdever#4170, охота пообщаться.
Я в 2005 году играл в доту. Тогда интернет был 64Кбит/с. И я помню что игра тормозила только когда все герои оказывались в одном экране. В остальных случаях все работало нормально, без тормозов на фпс 40. Хотелось бы услышать хотябы в общих чертах как сделан так сервер что он тянет так мало клиентов? Кстати в доте насколько мне было известно в качестве сервака выступала одна из клиентских машин.
Он и пятьдесят потянет, и сто, это ограничение самой игры.
там передаются действия всех игроков. не положение героев, а просто все действия. Поэтому скорее всего дело не в том что вы видели много игроков, а в том что они делали много действий
Хотелось бы услышать хотябы в общих чертах как сделан так сервер что он тянет так мало клиентов?

Доты или НФС: МВ?

Если я не ошибаюсь, то в 2005-м дота была как карта ВК3 и там, по сути, все работало ровно так же как обычный стратежный мультиплеер, потому что аддон только использовал встроенные возможности для модификации (которые, конечно, для того времени были просто шикарными). Само собой, как и оригинальный Варик, в качестве сервера использовалась одна из клиентских машин. К счастью, стратегии не так чувствительны к пингу и, впринципе, обновление раз в 100 мс для них не так заметно в силу особенностей (анимации имеют существенную задержку, игрок может отдать приказ, а юниты сами знают куда бежать, алгоритмы же более-менее детерминированные).

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

Хуже всего — мультиплеер для гонок, где 100 км/час — это 28 метров в секунду. То есть за 100 мс (вполне неплохой пинг для непрофессиональной игры) машина проезжает 2.8 метра. Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне. И для игрока А считается допустимым повернуть повернуть направо (там ведь нету машины соперника), а клиент игрока Б понятия не имеет как обработать эту ситуацию. Авторам статьи уважение и почет, что они взялись за такую стремную задачу.

Как вам выше ответили игра скорее всего тормозила не из-за пинга, а из-за анимаций множества действий. То же можно было наблюдать и в обычной синглплеерной игре против многих компьютеров — когда шёл жесткий замес со множество юзеров — игра начинала подтормаживать, а то, что у вас было всего 40 фпс указывает, что даже в спокойной обстановке компьютер работал почти на пределе.

Если бы были проблемы с каналом, то это проявлялось бы иначе — противники бы «телепортировались» в неожиданные места, обновлялись бы дерганно — пробежал, остановился, пробежал быстрее, внезапно скастовав сразу три заклинания и т.п.

А если бы у вас не хватало ширины канала, (скажем, игра расчитана на минимум 128 кбит/с, а у вас всего 64 кбит/с), то вы бы просто не смогли играть со временем (с увеличением количества юнитов — увеличивается и нагрузка на канал). Хотя, если я не ошибаюсь, в доте всегда приблизительно одинаковое количество юнитов, а следовательно и стабильная нагрузка на канал в силу гейм-дизайна.
Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне. И для игрока А считается допустимым повернуть повернуть направо (там ведь нету машины соперника), а клиент игрока Б понятия не имеет как обработать эту ситуацию.

Теория относительности как она есть.
… Сложнее с шутерами — там используется еще больше трюков и из-за этого в Контре можно увидеть такой баг...

В дотке, которая была картой WC3, были другие грустные ситуации — юзаешь скилл или расходник, а он не юзается из-за того, что потерялся пакет или пинг высокий. То же самое с добиванием крипов: тыцнул "атака" вовремя, лаг/задержка — крипа убил не ты.


Всё же, это не классическая стратегия, где ± 100 мс на обработку "начни апгрейд здания", по большому счёту, ничего не решают. Это скорее экшн от третьего лица, чем стратегия.

То есть за 100 мс (вполне неплохой пинг для непрофессиональной игры) машина проезжает 2.8 метра. Если грубо, то для игрока А игрок Б едет сзади, а игроку Б кажется, что они с игроком А на одном уровне.

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

Вот смотрите, две гипотетических ситуации.

1. У игрока А пинг 1 мс, у игрока Б пинг 200 мс. Начинается игра, оба посылают на сервер «еду вперед». Через 100 мс (200 / 2) на сервере и игрока будут значения: игрок А начал ехать в момент 1мс и проехал 1 метр, игрок Б только начал ехать. Для игрока Б значение будет следующее: игрок А начал ехать, игрок Б начал ехать 100 мс.

2. Больше доверия клиенту, не только команду, но и время от начала гонки, когда игрок стартовал. Начинается игра. Игрок Б и игрок А стартует, но видят старт другого игрока только через 100 мс.

Теперь представляем другое. Игрок А и Б едут по соседним полосам на большой скорости. Навстречу игроку Б летит грузовик. В последний момент игрок Б нажимает кнопку вправо и обходит грузовик, но на сервер и к игроку А эта информация приходит слишком поздно, по их экстраполяции столкновение с грузовиком уже произошло, запущена анимация взрыва и отняты последние хит поинты у машины. Теперь мы или пост-фактум сообщаем игроку Б: «извини, парень, мы передумали, ты не успел». Или на сервере и у игрока А говорим: «не, стоп, столкновения не было, игрок Б таки не взорвался, грузовик верни на место, анимацию взрыва останови, игрок Б на самом деле объехал грузовик справа».

Дальше, два игрока едут рядом. Игрок Б видит грузовик на крайней левой полосе и в последний момент нажимает кнопку «влево», толкая игрока А прям в грузовик. Для игрока Б все произошло как раз вовремя, запускается анимация тарана игрока А. Пока игроку А дошла информация о маневре игрока Б он уже проехал грузовик и может ударится только ему вбок. Нам необходимо инвалидировать или информацию игрока А или информацию игрока Б, а инвалидация — это не просто изменить координаты, а сложные изменения логики в физике

Конечно, команды с привязкой ко времени хотя и дают больше возможности читерам и усложняют написание сервер — для игры значительно лучше, но тоже имеют множество проблем и как раз за счет скоростей и возможностей резкой смены скорости (хорошие тормоза, контролированный или неконтролированный удар)

В шутерах, конечно, нету инерционности, но зато там значительно меньшие скорости и, обычно, значительно меньше важность у физики.
По поводу гонок, кстати: у нас нет «комнат», игроки могут начать не одновременно, а ещё просто катающиеся в свободном режиме игроки тоже видны в гонке, как от их стороны видны и гоняющиеся. Они просто в гонке на последнем месте, вот и все. И да, в МВ машины не бьются.

Со стратегиями — да. Более менее норм.


В шутерах и прочих Экшн играх используется интерполяция — сервер говорит, то что было n-миллисекунд назад, хотя слушает в реалтайме. Это сделано для того, чтобы он знал все действия на шаг вперед и клиенты могли "сгладить" движения.
В итоге в Counter-Strike 1.6 был даже фича баг, из-за которой игроки, которые выстрелили в промежуток меньший чем те же n-миллисекунд, убивали друг друга и раунд заканчивался ничьёй.
В CS:GO — это пофиксили, поэтому порой случается так, что ты слышишь выстрел, уже радуешься победе, а игра показывает что ты умер, а противник жив.
С гонками и симуляторами космических кораблей поступают совсем иначе — используют обратный метод к интерполяции — экстраполяцию: ты говоришь что другая машина находится в координатах xyz и движется со скоростью uV (u — вектор направления движения, V — скорость). Отсылая эти данные на клиент мы можем на стороне клиента смоделировать плавное движение других машин.
Из-за этого в таких гонках можно увидеть как машина противника уезжает в стену, ты ликуешь, а потом оказывается что был рассинхрон и он на самом деле всё ещё впереди тебя. Второй случай — когда они врезаются в объекты и, сначала кажется будто они прошли через них или объехали, а потом "возвращаются" на место столкновения.
З.ы. мне кажется что нечто подобное с экстраполяцией использовали и в WoW — когда происходит рассинхрон — если герой на момент рассинхрона шёл вперед, то он продолжает идти вперед.

100 мс может быть между континетами, обычно он до 50 мс.

У меня в КС: Го стабильный пинг 100 мс.

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

между континентами он больше. Переехал из одного города в другой. Расстояние 350км. В первом пинг был в районе 35мс, в текущем 15мс.

Не больше. Сев Ам. и Москва, пинг примерно 110.
Северная Америка и центральная Европа — 130
Кому как повезёт…
Rogers. Из Миссиссаги до Франкфурта (WoT сервер RU3). До Москвы около 150
А где можно поиграть в мультиплеерную версию игры?
Как только сервера будут работать — я вам напишу в ЛС. 14 августа, скорее всего, заработают.
Буду рад, если тоже получу сообщение :)
Тоже хочу очень по играть, за ранее спасибо!
А реализацию всей физики на сервере, а управления с передачей на сервер не пробовали?
Это конечно увеличит отклит на управление, но все остальные проблемы должны решиться.
Так и не нашёл комментария с тем, как найти ваш проект, а хотелось бы следить за его развитием)
Ранее тоже писал мультиплеер по гонкам на Unity. Очень интересно посмотреть вашу версию. Если не затруднит — скиньте тоже, пожалуйста!
Хорошо, сейчас скину. НЛО, знайте: меня попросили :P
Проект называется MW-Online.
Видео геймплея: https://youtu.be/LMGLWHeLuJo.
Скриншоты есть в статье, если хотите поиграть, то есть Discord-сервер: https://discord.gg/383Q6q5. Общение в основном на английском, но есть русский канал.
UFO landed and left these words here

Был бы очень рад тоже получить приглашение!

Открытый бета-тест идёт уже месяца 3-4.
Добавьте уже ссылки, не дело каждому заинтересованному в комментариях просить. Ради этого, первый раз за два года на сайте за логинился.
А где история о реверсе нужных оффсетов? В общем, мало технически-реверсных аспектов, больше организационные, ну и немного архитектурных.
В большинстве своём адреса нам давали безвозмездно мои друзья-моддеры, за что им огромное спасибо. Они, однако, не русские, потому тут не появятся.
А как выполнялось, собственно, программирование игры? Клиент является отдельным приложением, которое копошится в памяти у процесса NFS?
Куда лучше работает трюк из современных шутеров с передачей только действий игроков и лишь изредка сихронизацией координат.

Не могу ничего толком сказать про современные мультиплеерные шутеры. Q3, UT3 последние игранные из этого разряда

Судя по вашему описанию, вы передаёте не действия игрока, а скорость и угол движения авто. Впрочем, в случае гонок так даже лучше.
В том, что поправили баги и готовы показать продукт общественности?
В то время, как для игры 2005, в которой УЖЕ есть мультиплеер делают ещё один самопальный мультиплеер, никто не хочет заняться восстановлением сетевой кода для NFS World, для которого уже сделали основу сервера.

P.S. Osdever меня заминусует однозначно)
О, Влад, привет :3

Коммент одобрил. Ворлд же уже, вроде бы, вполне рабочий, не?
Если бы… Гонки всё так же с диким рассинхроном, замедлениями и ускорениями 1 на 1 + свободная езда, которая иногда и пяти минут не держится и вырубается (к тому же её кода у меня нет, а сервак с ней отберут, хех).

По поводу МВ-Онлайн, вам бы как-то найти параметры ботов, отвечающие за машину и её тюнинг, после брать эти же параметры с машины игрока и посредством передачи сервера присваивать их ботам (возможно чушь несу). Уже будет достойная основа :)
А возможна ли интерполяция для такого типа игр? На сколько знаю, в FPS играх для мультиплеера она активно применяется, даже про Quake не так давно была статья об этом.
Машины будут телепортироваться на небольшие расстояния, а не двигаться, а ещё колеса крутиться не будут.
Оптимистично всё. Но как только будет нормальный онлайн — наверняка будут проблемы. Появятся читеры, которые будут бесить обычных пользователей. Будут форумы, где эти читы буду продаваться/раздаваться. Задумайтесь сразу про то, что никогда и ни в чем нельзя доверять «клиенту», всё должно обязательно обсчитываться на сервере.
С радостью, да нет копии мира на сервере: игроки будут в стены влетать, ибо для сервера их просто нет.
Даю подсказку, она есть в клиенте :) Другой вопрос, сколько будет нужно времени и сил на ее вытаскивание, конвертирование и прикручивание к серверу.
Не занимайтесь ерундой, лучше поднимите мультиплеер NFS World.
С этими джавистами я кодить вместе не хочу, без обид. Да, они хорошие программисты, но Java я не знаю и учить не собираюсь, а пишут они именно на нем. Ерундой? Ерунда ваша собрала более 300 участников в чате, и это ещё без Хабра.
Sign up to leave a comment.

Articles