Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Свободные библиотеки для сетевых реалтайм-игр. Кто использовал? (9 стр)

Свободные библиотеки для сетевых реалтайм-игр. Кто использовал? (9 стр)

Страницы: 16 7 8 9 10 11 Следующая »
DelfigamerПостоялецwww23 мая 201820:30#120
skalogryz
> Мне почему-то говорят, что хранить историю (полную или нет) это плохо.
Нет, тебе говорят, что 1) плохо хранить полную историю и 2) плохо изменять историю.
В шутере, история хранится только для динамических объектов, только для тех из них, которые важны для хитскана, и только те параметры, которые важны для хитскана.
Взять, например, TF2. В ней история сохраняется в первую очередь для игроков, и сохраняемые параметры - это положение куклы и её костей (либо напрямую, либо через анимации - я не уверен). Физические пропы (оружие, ящики патронов и дорожные конусы) не сохраняются - они не блокируют хитскан. Статическая геометрия - разумеется, не сохраняется, она же статическая. Ворота, телеги и мвм-танки - вот на счёт них не в курсе, с одной стороны, они динамические и блокируют хитскан, с другой - их мало и они медленные либо стоят на месте, так что их откат/неоткат почти никогда не влияет на результат конкретного рейкаста. В итоге, из всего геймстейта, в историю записывается только малая часть.
Ну и сам же процитировал - после рейкаста, коллайдеры возвращаются на прежнее, актуальное место. Никаких перерасчётов, никаких конфликтов, история существует в единственнои и неизменном экземпляре.

Правка: 23 мая 2018 20:32

skalogryzУчастникwww23 мая 201820:31#121
Роман Шувалов
> > могу ли я включить режим "играй дальше" и игра дальше добежит и возьмёт
> > колечком за меня?
> Да, там даже есть несколько головоломок на эту тему.
как-то я сомневаюсь; потому что пропользя под препядствием, я окажусь в другом месте.
как она потом будет дальше куда-то добегать мне трудно это представить.

Насколько я понял, Rewind построен по тому что методу что Undo и Redo в редакторах.
Можно (условно) сколько влезет вносить правки.
Потом делать им Undo.
При желании сделать им Redo. (Redo можно сделать вплоть до самой полседней/первой откаченой правки)

Но, если сделав 4 раза undo, потом 2 раза redo, и после этого уже начинать писать то-то своё.
Оставшиеся 2 редо выкидываются нафиг из истории.

skalogryzУчастникwww23 мая 201820:37#122
Delfigamer
> 2) плохо изменять историю.
и это плохо потому-что...:
а) у сервера теперь неполная картина мира
б) серверу не нужно знать полную картину мира, он доверяет клиентам
в) другой вариант
???

Delfigamer
> В шутере, история хранится только для динамических объектов
Шутер это замечательно. Частный пример где нужно можно хранить частичную историю.
Как насчёт игр со 99% разрушаемым миром. Тот же майнкрафт?

Delfigamer
> Ну и сам же процитировал - после рейкаста, коллайдеры возвращаются на прежнее,
> актуальное место. Никаких перерасчётов, никаких конфликтов, история существует
> в единственнои и неизменном экземпляре.
это для случая "стрельбы" рейкаст.
а если игрок послал команду - (200мс назад) начал стрейф в лево.
то, он тоже ко времени (0) вернётся на прежднее место что ли? или он всё-таки будет уже где-то левее, чем сервер предполагал на момент получения пакета?

Правка: 23 мая 2018 20:47

Роман ШуваловУчастникwww23 мая 201820:48#123
skalogryz
> как она потом будет дальше куда-то добегать мне трудно это представить.
https://www.youtube.com/watch?v=OzvFAZ6_G3w
Перемотай на 11:55 (спойлер: спойлеры!)
DelfigamerПостоялецwww23 мая 201820:51#124
skalogryz
> и это плохо потому-что...:
в) усложняет логику на ровном месте.

skalogryz
> Как насчёт игр со 99% разрушаемым миром. Тот же майнкрафт?
Я не знаю, спроси у Эпиков, как они реализовали Фортнайт.
Там тоже много хранить не надо - строительные блоки туда-сюда не скачут, а после разрушения исчезают в никуда, так что вся история сводится к двум числам - время появления и время уничтожения. И то, при условии, что их откатывают - что вовсе не обязательно:
Delfigamer
> они медленные либо стоят на месте, так что их откат/неоткат почти никогда не
> влияет на результат конкретного рейкаста
skalogryz
> а если игрок послал команду - (200мс назад) начал стрейф в лево.
Читай мануал, там подробно расписано.

skalogryzУчастникwww23 мая 201821:34#125
Роман Шувалов
> Перемотай на 11:55 (спойлер: спойлеры!)
аааа....понял.
Перемотка используется для сохранения инструкций для тени (в частном случае)

Совсем не факт что это история.
Вот пример:

Записываем путь для тени: начал от 0-ля, прыгнуть на ящик 1, с ящика на платформу и до точки №2.

                2|
     1    -------|
    [][]         |
0   [][]         | 
-----------------+
После этого отматываемся к точке 0, достём базуку и уничтожаем ящик, таким образом, чтобы тень до него не успела добежать и запрыгнуть до позиции 1.

Как себя поведёт тень?
а) проигнорирует отсутствие ящика и доберётся до точки 2?
б) будет следовать инструкциям (вялая попытка допрыгнуть до платформы), и в итоге закончит в точке 3?
в) исчезнет т.к. не может выполнить записанные шаги? 

                 |
     1    -------|
    [][]         |
0   [][]        3| 
-----------------+
так или иначе, изменения истории здесь нет.
Есть записанные инструкции, которые просто нужно воспроизвести (по сути: +1 заскриптованный моб на карту).

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

Delfigamer
> усложняет логику на ровном месте.
> ..
> Читай мануал, там подробно расписано.
ссылка та же, процитируй уж.
а то у меня складывается впечатление, что ты её не очень читал. Или читал в переводе.

Правка: 23 мая 2018 21:38

DampireПостоялецwww23 мая 201822:11#126
skalogryz
> Допустим, ты не хранишь историю, а откатываешь её (просчитывая, действия в
> обратном порядке).
Ты болен? Что у нас нынче в дефиците. Память или скорость CPU?
> правильно ли я тебя понял, что ты тоже не можешь? ;)
> может и тебе не писать сетевые игры?
Значение имеет только серверный тикрейт. Который я могу легко гарантировать. Так что по прежнему советую тебе не писать сетевые игры.
> Единственная альтренатива хранению истории, это обратный отсчёт (или просчёт,
> это как хотите).
Для быстрых сетевых игр хранится только история. И ВНЕЗАПНО в режиме read only. Не надо путать Braid, который работает на одной машине с детерминированной математикой с сетевыми играми, которые работают на нескольких машинах и работают асинхронно тупо за счет плавающего латенси.
> я - храню историю, а кто-то пердпочитает пересчитать.
Никто не предпочитает.
> и это плохо потому-что...:
Если ты включишь мозги и поймешь к чему приведет изменение истории для всех игроков (латенси то работает в обе стороны), то поймешь и причины почему историю менять нельзя.
> Как насчёт игр со 99% разрушаемым миром. Тот же майнкрафт?
Ололо. Ты посылаешь на сервер команду. Сервер удаляет блок в текущем времени. Присылает тебе сообщение, что блок удален. Profit!!! Никакая история нах не нужна. Это и без того длительные операции и их достаточно синхронизировать просто в лоб.
> это для случая "стрельбы" рейкаст.
> а если игрок послал команду - (200мс назад) начал стрейф в лево.
> то, он тоже ко времени (0) вернётся на прежднее место что ли? или он всё-таки будет уже где-то левее, чем сервер предполагал на момент получения пакета?
facepalm.jpg
Ты про Client Side Prediction секцию прочитай шталь. Все описано. Команды применяются (и переприменяются при подходе новых данных) локально, точкой отсчета является сервер-сайд данные. На сервере данные применяются прямым потоком.

Правка: 23 мая 2018 22:12

skalogryzУчастникwww23 мая 201822:35#127
Dampire
> Для быстрых сетевых игр хранится только история.
хм, интересно "быстрая сетевая игра"... и чем она отличается от "медленной сетевой игры"?

Dampire
>> а если игрок послал команду - (200мс назад) начал стрейф в лево.
>> то, он тоже ко времени (0) вернётся на прежднее место что ли?
> Ты про Client Side Prediction секцию прочитай шталь.
причём тут Client-Side prediction?
Client-side prediction это для сглаживания собственного поведение клиента; чтобы User Experience не страдал.

Клиент А не может предсказать какую кнопку нажмёт Клиент Б.
Об информации о других игроках он целиком зависит от сервера.

Если сервер получил от клиента А, что тот начал стрейф -200 мс назад, какую информацию должен сервак послать Клиенту Б?
и что с этой информацией (сделает клиент Б), когда её получит?

Роман ШуваловУчастникwww23 мая 201822:36#128
skalogryz
> Перемотка используется для сохранения инструкций для тени (в частном случае)
> Совсем не факт что это история.
А кстати да, это не история позиций, это история "изменения состояния органов управления".
DampireПостоялецwww23 мая 201822:36#129
Игрок с рингом 200мс и игрок с пингом 50мс. Один тик 25мс.
Игрок2 Эй сервер, я 2 тика назад нажал кнопку вперёд, падлой буду.
Сервер Ну Лан. Эй игрок 1. 2 тика назад он стоял не там, а тут.
Игрок1 Блэт, ты же сказал что точно тут. Я в него стрелял и убил.
Игрок2 Хер тебе, меня там не было
Сервер Точняк, не было. Иди поешь говна Игрок1
Игрок1 Эй сервер, я 8 тиков назад был вон там.
Игрок2 Чо? 8 тиков назад там никого не было. Я никого не видел.
Сервер Лососни тунца, Игрок2. Он там был. Я скозал.
Игрок2 Но я же шмалял туда, и ты сказал "Нипапал)))0"
Сервер Ну бывает, чо. Скалогрыз же проектировал сервер.
skalogryzУчастникwww23 мая 201822:45#130
Dampire
> Сервер Ну Лан. Эй игрок 1. 2 тика назад он стоял не там, а тут.
> Сервер Точняк, не было. Иди поешь говна Игрок1
> Сервер Лососни тунца, Игрок2. Он там был. Я скозал.
Авторитарный сервер. Так они работают.

Оке, так кто-нить может мне объяснить, почему движение игрока не будут менять историю, хранимую на сервере?
или с точки зрения сервера игрок передвигается рывками?

т.е. прислал Клиент А, стрейф влево.
Сервер получил команду, учёл летенси, и поместил Клиента А в нужно время.
Без каких-либо промежуточных результатов.

Ну оке, это ведь тоже вариант, считать одни и те же вычисления. Не кешируя то, что уже было посчитано.

Правка: 23 мая 2018 22:45

DelfigamerПостоялецwww23 мая 201822:52#131
skalogryz
> т.е. прислал Клиент А, стрейф влево.
> Сервер получил команду, учёл летенси
Читай ещё раз, вот эту секцию.
As before, client inputs are sampled and a user command is generated. Also as before, this user command is sent off to the server.

"As before:"
The server has a somewhat similar loop:
1. Sample clock to find start time
2. Read client user input messages from network
3. Execute client user input messages
4. Simulate server-controlled objects using simulation time from last full pass
5. For each connected client, package up visible objects/world state and send to client
6. Sample clock to find end time
7. End time minus start time is the simulation time for the next frame

Правка: 23 мая 2018 22:55

DampireПостоялецwww23 мая 201822:56#132
skalogryz
> Авторитарный сервер. Так они работают.
Но почему-то такого дерьма нигде не наблюдается. Чувствуешь? Чувствуешь чем пахнет? Магия, не иначе.
> т.е. прислал Клиент А, стрейф влево.
> Сервер получил команду, учёл летенси, и поместил Клиента А в нужно время.
> Без каких-либо промежуточных результатов.
Никуда он его не помещал. Пойми наконец. Сервер видит прошлое состояние игрока. Каждого игрока. Что игрок нажимал 30мс назад. И не будет он ничего предсказывать по латенси, потому что это не постоянная величина. Каждый игрок видит прошлое состояние сервера. И еще более прошлое состояние всех игроков, кроме себя любимого. И не забывай про интерполяцию, которая еще до кучи добавляет задержку серверным сущностям.
Посмотри разбор сетевого кода Battlefield. Все понятно объясняется. Если запасешься секундомером, то сможешь сложить 2 и 2.
https://www.youtube.com/watch?v=vB0Vj9_c234&index=3&list=… ydoC9IQWOfvAy
И вообще весь канал очень доходчиво объясняет современные методы работы сетевого кода.
skalogryzУчастникwww24 мая 20182:01#133
Оке. Если сервер не держит историю.
Как он поступает с более сложными действиями.
Например: выстрел из гранатомёта. Как считается положение гранаты, если клиент прислал выстрел из прошлого.
И как сервер добивается того, чтобы его расчёты не вошли в противоречие с клиентом?
Sh.Tac.Постоялецwww24 мая 20182:13#134
skalogryz
> Как он поступает с более сложными действиями.
> Например: выстрел из гранатомёта
а чем оно более сложно?

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

Страницы: 16 7 8 9 10 11 Следующая »

/ Форум / Программирование игр / Сеть

2001—2018 © GameDev.ru — Разработка игр