forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Сеть в играх. (http://forum.boolean.name/showthread.php?t=9816)

Данил 08.11.2009 20:25

Сеть в играх.
 
Стало интересна сфера игр многопользовательских.

сделал простейший пример -
есть сервер, есть клиент.
Разница между ними только та, что сервер - основная программа, а клиент - подключается к серверу.

Суть программы - это то, что имеется два объекта. Одним управляет игрок за сервером, другим - игрок за клиентом.

Как работает программа -
Объект сервера имеет переменные - Х, У, Скорость, Поворот.
И объект клиента имеет точно такие же переменные.

На сервере мы управляем одним объектом, затем посылаем клиенту Х,У,поворот нашего объекта.
Клиент их принимает, и рисует в нужной области с нужным поворотом объект, затем управляет своим объектом, и те же данные посылает серверу. Сервер же так же рисует.

Т.е. такая система -одним управляем, второй тупо рисуем по полученным данным.

Отправка и прием идет каждым циклом. отправляется, как я понял, за цикл - 8 байтов.

На деле же эта система передачи - наитупейшая.

Как вообще реализуется передача данных? Как правильно делаются игры многопользовательские?

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

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

jimon 08.11.2009 20:34

Ответ: Сеть в играх.
 
Данил
в шутерах есть сервер и клиент, они всегда разделены (когда чел на одном компе стартует игру то стартует и клиент и сервер), на сервере и клиенте есть игровое время, сервер опережает клиентов по времени, когда клиент двигается то он отправляет на сервер клавиши (грубо говоря), но у себя уже начинает движение, сервер анализирует клавиши, проводит симуляцию и всем отправляет состояние этого клиента, клиент принимает свое состояние и проводит коррекцию, движение других клиентов он интерполирует, зачастую на нужный момент времени клиент не может узнать куда движутся другие игроки на экране, потому используется метод предсказания куда они будут двигаться, а потом коррекция с реальными данными

при выстреле клиент передает данные на сервер, сервер отматывает время до того момента когда ты стрелял и смотрит попал ли ты или нет, клиент в это время уже играет анимацию смерти и тд, потом сервер передаёт всем результаты

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

а как в гонках даже не знаю

ps. всё это очень и очень сложно, за две ночи не напишешь, тут месяц надо убить чтобы достичь приемлемого качества

Tadeus 08.11.2009 21:10

Ответ: Сеть в играх.
 
GoodWin давал когда-то ссылочку:
http://www.hl-inside.ru/articles/mul...er-networking/

Nex 09.11.2009 07:51

Ответ: Сеть в играх.
 
Мне вот тоже интересно, как делать "нормальную" сеть между клиентами и сервером и создание нормального ИИ хотя бы как в примитивной стрелялке (что бы стены обруливали и выле себя хотя бы, как "тупой" игрок :-)) ... :)

Данил 09.11.2009 21:49

Ответ: Сеть в играх.
 
Попробовал сделать сеть.
Все просто - клиент, сервер.
Просто летаем на кубиках.
На неограниченное количество человек.

Ни-хре-на. Не получилось. А как тут передать информацию о том, что мы подключились, если в сервере уже указано ,что считывать? Посылать серверу команду о том, что считать?
И плюс еще вечная проблема со временем - тут ведь не моментально делается, если я сразу же отправлю данные, и сразу же начну принимать - не пойдет, ибо сервер не успеет обработать вдруг.
А как клиенту понять, когда он считывает данные, какие данные для какого объекта? Поименовывать? лишняя нагрузка, плюс в разы больше циклов... Короче, мозги уже кипят. А ведь это только начало того, что делали в шутерах.
Не мой уровень, не дорос я еще до сети.
Да, смогу сделать простейший обмен информацией. Но не игры. Нет... ну его...

moka 10.11.2009 03:16

Ответ: Сеть в играх.
 
Сервер должен иметь много частей. Такие как:
- Менеджер пользователей.
- Менеджер объектов.
Разные оптимизации, отвечающие за выбор участка информации, которую нужно передавать, и т.п.
В менеджере пользователей, задача сервера, это управлять пользователями, и держать их "в курсе дела".
Естественно каждый клиент имеет ID.
Также и объекты в мире - каждый объект имеет ID - и он должен быть везде одинаковым.
Таким образом не сложно уже применять какие-то действия.
Пока лучше забыть о физике - там уж слишком всё сложно.
Но перемещение, реализовать не так и сложно.
Кстати посылка пакетов не каждый цикл, этого будет слишком много, тем более за продолжительность цикла, пакет даже не успеет дойти (средняя продолжительность цикла составляет 1000мс/60упс=19мс.)
Тут подход должен быть с аналитической стороны, с листками бумаги, и карандашом, чтобы это всё уложить в голове ;)

jimon 10.11.2009 03:22

Ответ: Сеть в играх.
 
MoKa
Цитата:

Но перемещение, реализовать не так и сложно.
ну-ну :) при пингах больше 500 мс начинаются танцы с бубном, а любительская система и 50-100 мс не выдержит

moka 10.11.2009 03:26

Ответ: Сеть в играх.
 
jimon, дык, а где ты видел играбельный реалтайм с 500мс. Если такой пинг, то обычно в играх, на серверах стоят лимиты, которые тебя просто автоматически диссконектят.
Систему можно подгонять, и варьировать. Я перемещение по TCP/IP (лондон<>питер), реализовывал в 120пинга, а это примерно максимум, выше уже начинаются лаги, но ниже этого - играбельно в любую современную игру.

Данил 10.11.2009 22:17

Ответ: Сеть в играх.
 
На счет пингов пока даже и не задумывался, у меня передача / отправка идет каждым циклом. Хотя, думаю, может поставтиь тупо таймер на сервере и все?

Немного стал понимать все же всю архитектуру, уже как минимум сделал регистрацию клиентов на сервере...

Ky3R_94 12.11.2009 22:10

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

Tormaz 12.11.2009 22:38

Ответ: Сеть в играх.
 
Цитата:

Сообщение от Данил (Сообщение 124157)
Хотя, думаю, может поставтиь тупо таймер на сервере и все?

Это вовсе не тупо , а просто необходимо. И каждый пакет да и состояние сервера (кадр) желательно нумеровать :) к примеру от одного до тридцати( по количеству тиков в секунду которые тебе надо выбрать) так гораздо легче понять устаревший это кадр или нет , это если ты конечно динамичную игру делаешь . Сервер контры к примеру сохраняет данные кадры на сервере и сранивает твои действия в соответствии с твоим временем те номером твоего кадра, как правильно заметил jimon.
Поэтому если на сервере есть "лагер" :-D то ты можешь от него за угол упрыгать а сервер тебе пришлет пакетик нееет дружок ты убит и вытащит твой трупик назад :-D назад так сказать в прошлое изза тормоза ..
Вот тебе ссылочка http://developer.valvesoftware.com/w..._Networking:ru
Это пример так сказать одного из самых требовательных шутеров где точность достигается пожиранием ресурсов проца и сети на стороне сервера.
А коли ты ммо задумал делать то там и требования немного другие там немного попроще все поскольку при таком количестве клиентов и точности контры никакого кластера не хватит. Почитай по ссылке а я потом еще отпишусь , уж очень я люблю на эту тему поболтать :)
Перед разработкой ммо ты должен решить для начала какие задачи ты отдашь клиенту (вопрос безопасности и читерства) а какие будешь решать на сервере (вопрос загруженноси сервера )
К примеру контроль передвижения , контроль попадания, контроль урона, короче говоря каждое предполагаемое тобой действие в игре. Каким образом будет происходить перемещение игрока, т.е. насколько оно свободно ?
Реши сколько раз ты будешь синхронизировать состояние сервера и клиента в секунду. Короче говоря все не так уж и сложно.

Кстати а в контру здесь народ играет ?

Данил 12.11.2009 23:12

Ответ: Сеть в играх.
 
Мда, как же все сложно на самом деле.
В сурсе, как я понимаю ,своя архитектура? А в любой другой игре может быт все построено иначе? Или эта архитектура сети - идеал просто?

Я же все проще хотел сделать.
Чтобы сервер не проводил кучу расчетов, а просто был ... хм... проргаммой, которая связывала бы игроков :)
Т.е. в моем случае я думал сделать , чтобы, допустим ,каждые 50 миллисекунд клиент получал позиции объектов ( допустим, ближайших объектов). В пакете, допустим ,входили такие данные, как позиция объекта, поворот объекта, и команды объекта. Т.е. как - чтобы клиент ставил объект в нужном месте в нужном повороте, а потом просто эти 50 миллисекунд двигал объект по командам, команды в данном случае - то ,что нажимал другой клиент.

Но ,как понимаю, моя система - идиотизм?

jimon 12.11.2009 23:49

Ответ: Сеть в играх.
 
Данил
по твоей схеме не добиться ощущения присутствия

impersonalis 13.11.2009 00:36

Ответ: Сеть в играх.
 
уорниг метаморфирование ника детектед!
Tormaz

NitE 13.11.2009 00:48

Ответ: Сеть в играх.
 
impersonalis, баян...


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot