Hello, World! 🎄
А сервер уже в свою очередь будет уведомлять игроков о перемещении других игроков (посылать им сами передвижения, а не координаты).
Ну и раз в какое-то время сверять точность координат, чтобы клиенты нечего не напутали с подсчётами.
Egor
Hello, World! 🎄
Все что могу посоветовать, найти книгу какого-нибудь умного программиста который это пишет и почитать.
Egor
Egor
Hello, World! 🎄
Hello, World! 🎄
А так программирование как будущая работа после колледжа (последний год остался в колледже, если точнее то меньше полгода)
Egor
В зависимости от того, как именно она просчитывается
Хотяя, да, ты наверное прав..... ведь во всех случаях сервер должен знать ВСЕ окружение, типа впереди стена там итд.
И какая разница самописная херня считает или сделанный физ движок профессионалами (что намного лучше чем мои пыхтения)
Snusmumriken
Snusmumriken
Тут нельзя просто "придумать вариант" и не проверить его, потому что очень много что не учитывается мысленным экспериментом. Нужно иметь дохрена опыта чтобы понять, что будет работать а что нет, и то надо проверять.
Egor
Hello, World! 🎄
Snusmumriken
Не стоит.
Snusmumriken
Люди уже придумали шину событий и бесшовное выполнение вне зависимости от лагов.
Hello, World! 🎄
Egor
вот че бард говорит
Обновление позиций:
Сервер периодически отправляет клиентам обновления позиций объектов.
Клиенты интерполируют движение объектов между обновлениями.
Физическая симуляция:
Сервер и клиенты одновременно симулируют физику.
Клиенты корректируют свои симуляции, чтобы соответствовать обновлениям сервера.
Hello, World! 🎄
Luсky
Михаил
Как этим луа перехватить все *абсолютно все* потоки, включая stdin stdout stderr, чтобы в консоль ничего не выводилось и вместо консоли работал интерпретатр?
Михаил
и вводить через луа
UtoECat
Михаил
что значит перехватить потоки?
вот прога у меня есть допустим
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
Igor
Это системное ограничение, не луа
Михаил
если еще точнее - допустим я пишу расширение для GDB на луа. просто все сообщения перехватываю, производится парсинг всех этих строк и подсветка, и весь ввод - ну вы поняли
Igor
Михаил
пайпы доступны в луа?
Igor
Нет
Igor
Через LuaJIT до них можно длстучатьчя
Михаил
о, как раз
Igor
Но это системозависимая фигня
Михаил
на линуксе и шинде будут работать?
Igor
Везде разная имплементация, у винды своя, у юниксов своя
Михаил
если код различается но можно сделать то же самое на обеих системах - напишу обертку, пофиг
Igor
Igor
luaposix или как-то так называется, я ужн подзабыл
Михаил
мне нужно что то вроде https://github.com/rhysd/go-fakeio
только для луа
usernameak
UtoECat
Igor
Snusmumriken
То что через tcp это нормально
Snusmumriken
Ага, а ещё делает это всё через TCP)))
Нормальная шина событий с нормальными таймстампами прекрасно работает с задержками ниже полусекунды. На TCP пофигу. Особенно если отключить Нейгла.
usernameak
Igor
То что через tcp это нормально
Ну не всегда, я б не сказал, что для подобной игры использовать TСP для передачи игроков и событий в мире – это ок
Igor
Типа для каких-нибудь пошаговых игрушек ладно
Snusmumriken
Snusmumriken
Не нужно передавать "быстро". Нужно уметь откатывать мир.
Snusmumriken
Открою очень страшный секретик. Какая-нибудь супер быстрая лига легенд тоже прекрасно работает по тсп. Пинг начинает ощущаться только если ты играешь на ком-то СУПЕР быстром или выше сотки.
usernameak
Snusmumriken
Кому-то пора читать закон дырявых абстракций.
Snusmumriken
https://habr.com/ru/companies/selectel/articles/512796/
Snusmumriken
ЮДП в сетевых игрушках очень любят только потому, что не надо трахаться с откатами мира, и можно просто условно перетирать координаты и прибавлять велосити.
И типа "быстро".
Но это "быстро" на практике недостаточно быстро, и в современном мире в любом случае приходится уметь обрабатывать сообщения которые были созданы пол секунды назад. А тут становится не важно, тсп или юдп. Наоборот, если порядок сообщенек сохраняется, то меньше откатывать мир.
usernameak
Igor
Igor
Snusmumriken
Сейчас ещё такое очень интересное время, когда народ начал отказываться от "тиков" сервера.
usernameak
usernameak
бля....
Snusmumriken
Вон в рекламе каэсочки го 2 вопили, мол "мы больше не делаем тики! у нас теперь бесшовный апдейт, каждое действие считается в своё время" — это они наконец начали использовать технологии начала нулевых. Когда сервер это просто проигрыватель для событий "из прошлого". Урааа!
Snusmumriken
https://habr.com/ru/articles/302394/
usernameak
бля я помню неткод на моей прошлой работе
никаких тиков сервера, TCP, кривой предикшен который дико миспредиктит даже самые простые случаи, отключенная проверка коллизий на сервере потому что иначе игроки цеплялись, сериализация пакетов прямо посреди серверной логики (слава богам на клиенте такого почти не было; да и лоулевел часть клиентского неткода я переписал - хотя бы стала лучше латенси внутри самого клиента) и ещё множество треша и угара
usernameak
usernameak
usernameak
Кароч. Один из самых качественных современных методик это примерно следующее:
1. Сервер сохраняет состояние активных сущностей мира с прошлого тика в отдельной копии, коих может накопить допустим штук двадцать.
2. Серверу приходит сообщение "я ножал прыжок вот в это время".
3. Сервер берёт ближайшее состояние мира к этому событию, там обычно доля от dt.
4. Сервер обновляет это состояние мира до момента нажатия прыжка.
5. Сервер применяет событие прыжка.
6. Сервер обновляет все последующие сохраненные копии состояний мира, но с учетом прыжка, рассылает всем сгенерированные события а ля коллизии-эффектики-партикли и прочее, с метками времени офк.
7. Серверу приходит сообщение "я сделал пиу-пиу вот в это время".
8. Сервер берёт ближайшее состояние мира к этому событию.
9. Сервер обновляет это состояние мира до момента "пиу-пиу".
10. Сервер применяет событие "сделяль пиу-пиу".
11. Сервер обновляет все сохраненные копии состояний мира, но с учетом "пиу-пиу", и рассылает всем соответствующие сгенерированные события "пуля была создана вот тут и попала вот сюда, отскочила здесь и отправилась в голову вот этому".
Тиков нет. Срезы существуют только для упрощения перемотки назад и применения.
ТСП или ЮДП — не важно. Но с тем что у ТСП явный порядок, нам точно не придётся мотать дальше взад чем с текущим событием.
Можно взять весь поток событий и полностью восстановить всю последовательность действий.
всё это предполагает, что время на обеих сторонах идёт с одинаковой скоростью
что не гарантируется из-за неидеальной точности таймеров
Snusmumriken
А вот для этого, есть простенькие методики синхронизации времени на разных машинах с учетом пинга. Просто делаешь это время от времени, раза в пять-десять секунд достаточно.