Hello, World! 🎄
А сервер уже в свою очередь будет уведомлять игроков о перемещении других игроков (посылать им сами передвижения, а не координаты). Ну и раз в какое-то время сверять точность координат, чтобы клиенты нечего не напутали с подсчётами.
Hello, World! 🎄
В таком случае, самый дешёвый вариант получается считать все самому? А не на физ. Движок полагаться?
Всё зависит от того как сервер и клиент обмениваются данными, архитектуры взаимодействия. Я советую особо не воспринимать мои сообщения как что-то умное, т.к сам я не пишу игры с многопользовательским режимом игры. У меня нету огромного опыта в этом. Да и в разработке игр тоже мало, что есть. Больше по другим направлениям знаю.
Hello, World! 🎄
Все что могу посоветовать, найти книгу какого-нибудь умного программиста который это пишет и почитать.
Hello, World! 🎄
Я просто к чему, не офигеет ли сервер от просчитываний физики?
В зависимости от того, как именно она просчитывается
Hello, World! 🎄
А я вообще как хобби занимаюсь))
Меня больше интересует создание симуляций, на Love2d обычно пишу, иногда на C.
Hello, World! 🎄
А так программирование как будущая работа после колледжа (последний год остался в колледже, если точнее то меньше полгода)
Egor
В зависимости от того, как именно она просчитывается
Хотяя, да, ты наверное прав..... ведь во всех случаях сервер должен знать ВСЕ окружение, типа впереди стена там итд. И какая разница самописная херня считает или сделанный физ движок профессионалами (что намного лучше чем мои пыхтения)
Snusmumriken
Я думаю, что можно сделать такой вариант. Клиент отправляет серверу намерение куда-то пойти, если всё ок, то сервер возвращает клиенту true, если нет, то возвращает false и клиент переносится на прошлые координаты. Но с другой стороны это затратно считать на сервере.
Ммм, только это приведёт к куче лагов на границах. Выходишь ты такой из-за угла. На клиенте ты уже такой можешь выйти из-за угла. На сервере ты ещё не можешь выйти из-за угла. Он возвращает false. Клиент идёт в жопу и застревает.
Hello, World! 🎄
Хотяя, да, ты наверное прав..... ведь во всех случаях сервер должен знать ВСЕ окружение, типа впереди стена там итд. И какая разница самописная херня считает или сделанный физ движок профессионалами (что намного лучше чем мои пыхтения)
Я к тому, что если у тебя шахматная доска, то перемещения очень просто считать. Если у тебя игра по ходам, то всё просто. Если у тебя уже есть x: y float координаты, уже сложнее вычислять когда игрок может двигаться с более сложной физикой. Ещё сложнее вдруг у тебя там каждая частица высчитывается. Думаю понимаешь как может быть и где проще, а где нет.
Snusmumriken
Тут нельзя просто "придумать вариант" и не проверить его, потому что очень много что не учитывается мысленным экспериментом. Нужно иметь дохрена опыта чтобы понять, что будет работать а что нет, и то надо проверять.
Snusmumriken
Не стоит.
Snusmumriken
Люди уже придумали шину событий и бесшовное выполнение вне зависимости от лагов.
Egor
вот че бард говорит Обновление позиций: Сервер периодически отправляет клиентам обновления позиций объектов. Клиенты интерполируют движение объектов между обновлениями. Физическая симуляция: Сервер и клиенты одновременно симулируют физику. Клиенты корректируют свои симуляции, чтобы соответствовать обновлениям сервера.
Михаил
Как этим луа перехватить все *абсолютно все* потоки, включая stdin stdout stderr, чтобы в консоль ничего не выводилось и вместо консоли работал интерпретатр?
Михаил
и вводить через луа
UtoECat
Как этим луа перехватить все *абсолютно все* потоки, включая stdin stdout stderr, чтобы в консоль ничего не выводилось и вместо консоли работал интерпретатр?
лучше опищи что у тебя за окружение там - луа встроена в приложение и приложение выводит не нужное тебе в stdout или ты из луа что-то запускаешь и оно выводит лишнее в stdout?
Михаил
что значит перехватить потоки?
вот прога у меня есть допустим printf("enter number: "); scanf("%d", ...); printf("your number: %d", ...); я ее скомпилировал и вызвал, как с ней работать из консоли - понятно. Но мне так не нравится. Надо взять луа и сделать что0то вроде этого p = io.popen("myprog"); p:read_all(); p:write("123"); p:read_all(); p:close()
Михаил
а луашка standalone
Igor
Это системное ограничение, не луа
Михаил
если еще точнее - допустим я пишу расширение для GDB на луа. просто все сообщения перехватываю, производится парсинг всех этих строк и подсветка, и весь ввод - ну вы поняли
Михаил
пайпы доступны в луа?
Igor
Нет
Igor
Через LuaJIT до них можно длстучатьчя
Михаил
о, как раз
Igor
Но это системозависимая фигня
Михаил
на линуксе и шинде будут работать?
Igor
Везде разная имплементация, у винды своя, у юниксов своя
Михаил
если код различается но можно сделать то же самое на обеих системах - напишу обертку, пофиг
Igor
luaposix или как-то так называется, я ужн подзабыл
Михаил
мне нужно что то вроде https://github.com/rhysd/go-fakeio только для луа
usernameak
Я в курсе что ты делаешь, это самый тупой очевидный и лагающий вариант
майнкрафт неиронично так делает правда там не особо критичны проблемы этого
Snusmumriken
майнкрафт неиронично так делает правда там не особо критичны проблемы этого
Майнкрафт неиронично имеет отвратительный сетевой код и в него невозможно играть с пингом выше сотки.
UtoECat
мне нужно что то вроде https://github.com/rhysd/go-fakeio только для луа
нет, это ограничено приложением, которое эту либу юзает.
Snusmumriken
То что через tcp это нормально
usernameak
ну да, но я видел и похуже...
(как тебе сериализация пакетов прямо посреди логики?)
Snusmumriken
Ага, а ещё делает это всё через TCP)))
Нормальная шина событий с нормальными таймстампами прекрасно работает с задержками ниже полусекунды. На TCP пофигу. Особенно если отключить Нейгла.
Igor
То что через tcp это нормально
Ну не всегда, я б не сказал, что для подобной игры использовать TСP для передачи игроков и событий в мире – это ок
Igor
Типа для каких-нибудь пошаговых игрушек ладно
Snusmumriken
Не нужно передавать "быстро". Нужно уметь откатывать мир.
Snusmumriken
Открою очень страшный секретик. Какая-нибудь супер быстрая лига легенд тоже прекрасно работает по тсп. Пинг начинает ощущаться только если ты играешь на ком-то СУПЕР быстром или выше сотки.
Igor
Это действительно ок. При нормальном сетевом коде TCP это норма.
Ну это ок до тех пор, пока за дело не берутся такие пацаны, как "нестабильная связь" и "потеря пакетов"
usernameak
но её очень сложно ретрофиттить если это не закладывалось изначально
напримееер, если в одиночной игре в какой-то момент появляется поддержка сети
Snusmumriken
Ну это ок до тех пор, пока за дело не берутся такие пацаны, как "нестабильная связь" и "потеря пакетов"
А если ты сидишь с мобильного тырнетика по 3g то нечего тебе делать в быстрой сетевой игре. Те же потери пакетов и нестабильная связь задевают юдп не меньше чем тсп.
usernameak
Ну это ок до тех пор, пока за дело не берутся такие пацаны, как "нестабильная связь" и "потеря пакетов"
вспоминается кс, где при малейшем пакетлоссе ты не можешь двигаться. а там UDP!
Snusmumriken
Кому-то пора читать закон дырявых абстракций.
Snusmumriken
https://habr.com/ru/companies/selectel/articles/512796/
Snusmumriken
ЮДП в сетевых игрушках очень любят только потому, что не надо трахаться с откатами мира, и можно просто условно перетирать координаты и прибавлять велосити. И типа "быстро". Но это "быстро" на практике недостаточно быстро, и в современном мире в любом случае приходится уметь обрабатывать сообщения которые были созданы пол секунды назад. А тут становится не важно, тсп или юдп. Наоборот, если порядок сообщенек сохраняется, то меньше откатывать мир.
Igor
вспоминается кс, где при малейшем пакетлоссе ты не можешь двигаться. а там UDP!
В кс тоже неткод так себе, да и ориентация там на КиБеРсПоРтИвНоСтЬ, нельзя чтобы игрок отодвинулся сильно дальше от последней извесиной серверу его позиции
Snusmumriken
Сейчас ещё такое очень интересное время, когда народ начал отказываться от "тиков" сервера.
usernameak
бля....
Snusmumriken
Вон в рекламе каэсочки го 2 вопили, мол "мы больше не делаем тики! у нас теперь бесшовный апдейт, каждое действие считается в своё время" — это они наконец начали использовать технологии начала нулевых. Когда сервер это просто проигрыватель для событий "из прошлого". Урааа!
Snusmumriken
https://habr.com/ru/articles/302394/
usernameak
бля я помню неткод на моей прошлой работе
никаких тиков сервера, TCP, кривой предикшен который дико миспредиктит даже самые простые случаи, отключенная проверка коллизий на сервере потому что иначе игроки цеплялись, сериализация пакетов прямо посреди серверной логики (слава богам на клиенте такого почти не было; да и лоулевел часть клиентского неткода я переписал - хотя бы стала лучше латенси внутри самого клиента) и ещё множество треша и угара
usernameak
Snusmumriken
Кароч. Один из самых качественных современных методик это примерно следующее: 1. Сервер сохраняет состояние активных сущностей мира с прошлого тика в отдельной копии, коих может накопить допустим штук двадцать. 2. Серверу приходит сообщение "я ножал прыжок вот в это время". 3. Сервер берёт ближайшее состояние мира к этому событию, там обычно доля от dt. 4. Сервер обновляет это состояние мира до момента нажатия прыжка. 5. Сервер применяет событие прыжка. 6. Сервер обновляет все последующие сохраненные копии состояний мира, но с учетом прыжка, рассылает всем сгенерированные события а ля коллизии-эффектики-партикли и прочее, с метками времени офк. 7. Серверу приходит сообщение "я сделал пиу-пиу вот в это время". 8. Сервер берёт ближайшее состояние мира к этому событию. 9. Сервер обновляет это состояние мира до момента "пиу-пиу". 10. Сервер применяет событие "сделяль пиу-пиу". 11. Сервер обновляет все сохраненные копии состояний мира, но с учетом "пиу-пиу", и рассылает всем соответствующие сгенерированные события "пуля была создана вот тут и попала вот сюда, отскочила здесь и отправилась в голову вот этому". Тиков нет. Срезы существуют только для упрощения перемотки назад и применения. ТСП или ЮДП — не важно. Но с тем что у ТСП явный порядок, нам точно не придётся мотать дальше взад чем с текущим событием. Можно взять весь поток событий и полностью восстановить всю последовательность действий.
usernameak
и это всё при том, что там передвижение было даже не свободным, а выбором позиций мышкой
оно было настолько fragile, что мы в какой-то момент перестали даже пытаться трогать неткод - потому что малейшее изменение влияло на то, как чувстовалась игра
usernameak
Кароч. Один из самых качественных современных методик это примерно следующее: 1. Сервер сохраняет состояние активных сущностей мира с прошлого тика в отдельной копии, коих может накопить допустим штук двадцать. 2. Серверу приходит сообщение "я ножал прыжок вот в это время". 3. Сервер берёт ближайшее состояние мира к этому событию, там обычно доля от dt. 4. Сервер обновляет это состояние мира до момента нажатия прыжка. 5. Сервер применяет событие прыжка. 6. Сервер обновляет все последующие сохраненные копии состояний мира, но с учетом прыжка, рассылает всем сгенерированные события а ля коллизии-эффектики-партикли и прочее, с метками времени офк. 7. Серверу приходит сообщение "я сделал пиу-пиу вот в это время". 8. Сервер берёт ближайшее состояние мира к этому событию. 9. Сервер обновляет это состояние мира до момента "пиу-пиу". 10. Сервер применяет событие "сделяль пиу-пиу". 11. Сервер обновляет все сохраненные копии состояний мира, но с учетом "пиу-пиу", и рассылает всем соответствующие сгенерированные события "пуля была создана вот тут и попала вот сюда, отскочила здесь и отправилась в голову вот этому". Тиков нет. Срезы существуют только для упрощения перемотки назад и применения. ТСП или ЮДП — не важно. Но с тем что у ТСП явный порядок, нам точно не придётся мотать дальше взад чем с текущим событием. Можно взять весь поток событий и полностью восстановить всю последовательность действий.
всё это предполагает, что время на обеих сторонах идёт с одинаковой скоростью что не гарантируется из-за неидеальной точности таймеров
Snusmumriken
А вот для этого, есть простенькие методики синхронизации времени на разных машинах с учетом пинга. Просто делаешь это время от времени, раза в пять-десять секунд достаточно.