![]() |
Сеть в играх.
Стало интересна сфера игр многопользовательских.
сделал простейший пример - есть сервер, есть клиент. Разница между ними только та, что сервер - основная программа, а клиент - подключается к серверу. Суть программы - это то, что имеется два объекта. Одним управляет игрок за сервером, другим - игрок за клиентом. Как работает программа - Объект сервера имеет переменные - Х, У, Скорость, Поворот. И объект клиента имеет точно такие же переменные. На сервере мы управляем одним объектом, затем посылаем клиенту Х,У,поворот нашего объекта. Клиент их принимает, и рисует в нужной области с нужным поворотом объект, затем управляет своим объектом, и те же данные посылает серверу. Сервер же так же рисует. Т.е. такая система -одним управляем, второй тупо рисуем по полученным данным. Отправка и прием идет каждым циклом. отправляется, как я понял, за цикл - 8 байтов. На деле же эта система передачи - наитупейшая. Как вообще реализуется передача данных? Как правильно делаются игры многопользовательские? Возьмем шутер. Играет, допустим, два человека. На одном компе высчитывается вся логика, второй тупо прниимает эти данные? или же делятся задачи пополам? Допустим, как работают пули? выстрелил я - пуля по расчетам летит. Кажыдй цикл данные о пули передаются? или как? Или просто передали то, что чел такой-то выстрелил, , а у всех уже идет логика пули сама, и не надо уже больше ничего передавать? а как в гонках все работает? как в стратегиях? Кто знает, можете рассказать о всей этой работе в играх. А то сам пока точно понять не могу. Как мне кажется ,система эта очень гибкая, и идеального решения нет. |
Ответ: Сеть в играх.
Данил
в шутерах есть сервер и клиент, они всегда разделены (когда чел на одном компе стартует игру то стартует и клиент и сервер), на сервере и клиенте есть игровое время, сервер опережает клиентов по времени, когда клиент двигается то он отправляет на сервер клавиши (грубо говоря), но у себя уже начинает движение, сервер анализирует клавиши, проводит симуляцию и всем отправляет состояние этого клиента, клиент принимает свое состояние и проводит коррекцию, движение других клиентов он интерполирует, зачастую на нужный момент времени клиент не может узнать куда движутся другие игроки на экране, потому используется метод предсказания куда они будут двигаться, а потом коррекция с реальными данными при выстреле клиент передает данные на сервер, сервер отматывает время до того момента когда ты стрелял и смотрит попал ли ты или нет, клиент в это время уже играет анимацию смерти и тд, потом сервер передаёт всем результаты в стратегиях такие мудрости не нужны, возможно что используется передача команд игрока всем другим игрокам и игрок как бы играет "виртуально", а всё остальное регулирует сервер а как в гонках даже не знаю ps. всё это очень и очень сложно, за две ночи не напишешь, тут месяц надо убить чтобы достичь приемлемого качества |
Ответ: Сеть в играх.
GoodWin давал когда-то ссылочку:
http://www.hl-inside.ru/articles/mul...er-networking/ |
Ответ: Сеть в играх.
|
Ответ: Сеть в играх.
Попробовал сделать сеть.
Все просто - клиент, сервер. Просто летаем на кубиках. На неограниченное количество человек. Ни-хре-на. Не получилось. А как тут передать информацию о том, что мы подключились, если в сервере уже указано ,что считывать? Посылать серверу команду о том, что считать? И плюс еще вечная проблема со временем - тут ведь не моментально делается, если я сразу же отправлю данные, и сразу же начну принимать - не пойдет, ибо сервер не успеет обработать вдруг. А как клиенту понять, когда он считывает данные, какие данные для какого объекта? Поименовывать? лишняя нагрузка, плюс в разы больше циклов... Короче, мозги уже кипят. А ведь это только начало того, что делали в шутерах. Не мой уровень, не дорос я еще до сети. Да, смогу сделать простейший обмен информацией. Но не игры. Нет... ну его... |
Ответ: Сеть в играх.
Сервер должен иметь много частей. Такие как:
- Менеджер пользователей. - Менеджер объектов. Разные оптимизации, отвечающие за выбор участка информации, которую нужно передавать, и т.п. В менеджере пользователей, задача сервера, это управлять пользователями, и держать их "в курсе дела". Естественно каждый клиент имеет ID. Также и объекты в мире - каждый объект имеет ID - и он должен быть везде одинаковым. Таким образом не сложно уже применять какие-то действия. Пока лучше забыть о физике - там уж слишком всё сложно. Но перемещение, реализовать не так и сложно. Кстати посылка пакетов не каждый цикл, этого будет слишком много, тем более за продолжительность цикла, пакет даже не успеет дойти (средняя продолжительность цикла составляет 1000мс/60упс=19мс.) Тут подход должен быть с аналитической стороны, с листками бумаги, и карандашом, чтобы это всё уложить в голове ;) |
Ответ: Сеть в играх.
MoKa
Цитата:
|
Ответ: Сеть в играх.
jimon, дык, а где ты видел играбельный реалтайм с 500мс. Если такой пинг, то обычно в играх, на серверах стоят лимиты, которые тебя просто автоматически диссконектят.
Систему можно подгонять, и варьировать. Я перемещение по TCP/IP (лондон<>питер), реализовывал в 120пинга, а это примерно максимум, выше уже начинаются лаги, но ниже этого - играбельно в любую современную игру. |
Ответ: Сеть в играх.
На счет пингов пока даже и не задумывался, у меня передача / отправка идет каждым циклом. Хотя, думаю, может поставтиь тупо таймер на сервере и все?
Немного стал понимать все же всю архитектуру, уже как минимум сделал регистрацию клиентов на сервере... |
Ответ: Сеть в играх.
я делал всё сложней наверно - с компа клиента кидал инфу на сервак, с сервака - всем клиентам инфу о других клиентах. ну и ещё проверка была, что всем всё дошло. не дошло, тогда ждемсс. и в то время как бы нельзя двигаться. поищу исходник. коль не найду то попытаюсь собрать опять
|
Ответ: Сеть в играх.
Цитата:
Поэтому если на сервере есть "лагер" :-D то ты можешь от него за угол упрыгать а сервер тебе пришлет пакетик нееет дружок ты убит и вытащит твой трупик назад :-D назад так сказать в прошлое изза тормоза .. Вот тебе ссылочка http://developer.valvesoftware.com/w..._Networking:ru Это пример так сказать одного из самых требовательных шутеров где точность достигается пожиранием ресурсов проца и сети на стороне сервера. А коли ты ммо задумал делать то там и требования немного другие там немного попроще все поскольку при таком количестве клиентов и точности контры никакого кластера не хватит. Почитай по ссылке а я потом еще отпишусь , уж очень я люблю на эту тему поболтать :) Перед разработкой ммо ты должен решить для начала какие задачи ты отдашь клиенту (вопрос безопасности и читерства) а какие будешь решать на сервере (вопрос загруженноси сервера ) К примеру контроль передвижения , контроль попадания, контроль урона, короче говоря каждое предполагаемое тобой действие в игре. Каким образом будет происходить перемещение игрока, т.е. насколько оно свободно ? Реши сколько раз ты будешь синхронизировать состояние сервера и клиента в секунду. Короче говоря все не так уж и сложно. Кстати а в контру здесь народ играет ? |
Ответ: Сеть в играх.
Мда, как же все сложно на самом деле.
В сурсе, как я понимаю ,своя архитектура? А в любой другой игре может быт все построено иначе? Или эта архитектура сети - идеал просто? Я же все проще хотел сделать. Чтобы сервер не проводил кучу расчетов, а просто был ... хм... проргаммой, которая связывала бы игроков :) Т.е. в моем случае я думал сделать , чтобы, допустим ,каждые 50 миллисекунд клиент получал позиции объектов ( допустим, ближайших объектов). В пакете, допустим ,входили такие данные, как позиция объекта, поворот объекта, и команды объекта. Т.е. как - чтобы клиент ставил объект в нужном месте в нужном повороте, а потом просто эти 50 миллисекунд двигал объект по командам, команды в данном случае - то ,что нажимал другой клиент. Но ,как понимаю, моя система - идиотизм? |
Ответ: Сеть в играх.
Данил
по твоей схеме не добиться ощущения присутствия |
Ответ: Сеть в играх.
уорниг метаморфирование ника детектед!
Tormaz |
Ответ: Сеть в играх.
impersonalis, баян...
|
Ответ: Сеть в играх.
Цитата:
Можно конечно делать контроль на читерство на нескольких машинах, проверять возможность действий и сравнивать результат. Это очень интересно. Но синхронизировать всех будет трудно. Но для начала создай выделенный сервер. Реши сколько раз в секунду будешь обновлять инфу и начинай уже писать простенькое приложение соединяющее нескольких клиентов.Просто передавай координаты и направление и обновляй их на клиентах. Потом займись плавным передвижением. Правда с протоколом в блитце напряг. Один выбор UDP. TCP не пойдет так как сервер висеть будет до прихода пакета а поток для него не выделишь ибо блитц и если клиент отрубится то навечный зависон гарантирован. Но страшного ничего нет. Пакеты UDP не теряются и приходят по порядку , если ты не северный с южным полюсом соединяешь да и там потери исключены это все страшилки и мифы , не гарантируется но доставляется все нормально. Так что на этом не заморачивайся. Первая моя программа такого типа это были шарики скользящие по земле :-D . Так что не идиотизм а интересная мысль но трудноисполнимая. сначала делай как все а потом глядишь и будешь первопроходцем с какой нибудь новаторской идеей )) Коннект к серверу осуществить можно на еще одном выделенном порту для этого. Можно все сделать на одном порту. Разработай протокол обмена инфой сервера и клиента. |
Ответ: Сеть в играх.
|
Ответ: Сеть в играх.
запустил посмотреть сервер 30 % проца скушал :( написано так понимаю на блитце ? мангос 2 % запущен та том же компе онлайн 12 человек.
|
Ответ: Сеть в играх.
Tormaz
и зачем ты меряешь загруженность проца ? у тебя там управление ядерным реактором что ли ? проц для того и создан чтобы выполнять на нём код, а не крутить в холостую, просто отдавай время системе и будет низкая загруженность проца |
Ответ: Сеть в играх.
А затем, что как только попадается мне сервер :) я сразу смотрю сколько он кушает. И если сервер тратит 30% времени проца то не управляет ли этот сервер атомным реактором ,возникает вопрос ?
Что будет с ним если законектятся хотя бы 1000 человек и еще кричуры начнут двигаться , а то не дай бог думать :) ? Это какой проц надо будет, если в холостую только 30 %. И если можно поподробней об отдать время системе ? Настроить какими средствами ? Я честно не очень в блитце разбираюсь. Или вы имеете ввиду приоритет в системе ? Правда я думал , что лучше серверу время отдавать как можно больше. |
Ответ: Сеть в играх.
Tormaz
с чего ты взял что загруженность процессора и количество выполненной программой работы это одно и тоже ? загруженность процессора это то сколько времени программа будет отдавать системе и не более того простейший пустой цикл на blitz3d : Код:
while true (по-сути загруженность в прямом смысле определяет соотношение сколько программного кода выполнилось на процессоре, к количеству холостого прогона, но количество выполненных инструкций никак не определяет количество реально выполненной работы, в прочем последнюю нельзя универсально измерять) Код:
Что будет с ним если законектятся хотя бы 1000 человек и еще кричуры начнут двигаться , а то не дай бог думать ? так что не занимайся эзотерическими вещами |
Ответ: Сеть в играх.
простейший пустой цикл на blitz3d :
while true wend будет сжирать все ресурсы одного ядра (загруженность 100% для одно ядерных процессоров и 50% для двух ядерных, для 4 ядерных - 25% и тд) Ты это все серьезно ? Или ты это меня разводишь ?;) Если разводишь то держи ответ - 30% это 3х ядерный проц :) И если запустить на 2ядерном проце 3 пустых цикла то системе придется отказаться от от одного из них. Я и говорю что сервер кушает очень много времени проца а не тепла там или еще чего. Пустой цикл или нет я не знаю к сожалению так же как и проц . Если он там пустые по логике циклы гоняет то понятно где собака зарыта, значит есть запас. :) |
Ответ: Сеть в играх.
Аааа черт возьми я только что запустил 4 и еще мангос сервак не вырубил. Разделила системка ровно 22-24. Но в принципе это ничего не заначит поскольку ты прав висяк жуткий. А как с этим бороться ? Как отдать время системе ?
|
Ответ: Сеть в играх.
Tormaz
вызывать delay 1 (1 тут означает 1 миллисекунду, можно и 5 поставить), по-сути это делает задержку на 1 миллисекунду, во время задержки менеджер задач ставит на выполнение другие потоки, таким образом ты отдал время системе, совсем не обязательно что реальная задержка будет ровно 1 миллисекунду, она может быть и 10 миллисекунд |
Ответ: Сеть в играх.
Ну сколько отдать понятно. Интересненько.. спасибочки ... щас достанем этот жуткий блитц ))) и снова помучаем..
Отлично выходит и входит. Если можно последний вопрос ? Откуда я должен знать что delay отдает время системе а не крутит пустые циклы ? В том смысле где посмотреть я это был должен раньше, до того как задал этот тупой вопрос? |
Ответ: Сеть в играх.
Tormaz
я не виноват что в справке это не написано :) |
Ответ: Сеть в играх.
Во многих случаях можно обойтись без тиков. Какраз сейччас делаю такую стреллялку, где координаты и углы передаются относительно событий клавы и мыши, без таймера.
Если просто: Игрок жмет на кнопу "вперед", формируется пакет, условно - "Игрок Вася начиннает движение врепед из точки X:Z и c углом Yaw". Пакет уходит на сервер, сервер ни чего не считая рассылает это на всех. Так он начинает двигаться у всех. Пока Василий держит кнопку ни чего не отсылается. Отпускает кнопку, отсылается пакет "остановка игрока Вася в точке X:Z". В пределах пинга 300-500 все работает вполне сносно. Всреднем игрок совершает 1 событие в 2-3 секунды, каждый пакет 6-10 байт (полезной информации + где-то 100 байт съедает сам TCP), это здорово экономит трафик относительно тиковой схемы. |
Ответ: Сеть в играх.
Damp
а если пинг будет не стабильным, а прыгать от 10 до 1000 плюс еще потеря пакетов 25% то твоя система не сможет добится одинаковой картинки у всех игроков, а одинаковая картинка это самое важное в сетевых играх |
Ответ: Сеть в играх.
Пинг так прыгает только на гпрс )) , у 3-х человек тестил с интернетом по проводам, всреднем от 70 до 300..400.
Такая схема может включать и пингкомпенсацию, 2-ух видов: задержка исполнения команды на своем клиенте и дельтатайминг у всех остальных (для этого каждый пакет дополняется информацией о пинге данного клиента). Конечно контры так не сделать, тк перс может идти только либо по прямой, либо по дуге с определенным радиусом, но что-то аркадно вполне, только что играли :) |
Ответ: Сеть в играх.
Цитата:
|
Ответ: Сеть в играх.
Цитата:
|
Ответ: Сеть в играх.
Доброго времени суток, Булчане! Что бы не плодить темы спрошу тут.
Написал программу сервер и программу клиент. Основаны на UDP протоколе. И вот собственно сам вопрос - что нибудь реально сделать если у меня закрыты для доступа из вне нужные мне порты (как оказалось после проверки - закрыты они у меня все, но нужны конкретно - 57015 и далее)? Потому что от меня пакеты исходят прекрасно и доходят до сервера, а вот от сервера ко мне на клиент ничего пробиться не может. Теоретически понимаю что наверно я сижу за NAT'ом (даже не наверно, а 100500% уверенности в этом), но как его обойти... Обрыл весь форум в поисках информации по протоколу UDP и вообще созданию сетевых приложений (огромное спасибо Tadeus'у за хорошие туториалы по TCP/IP и UDP, и всем кто в далёком 2009-м отписывал конкретно в этой теме), долго курил статью о работе стевой части Valve Source Engine, вынес для себя много полезного. Даже помучал IdTech 2 (что тоже оказалось очень полезно, так как текущую структуру сервера своего постарался взять от туда). Но конкретно по этой проблеме так ничего и не увидел. Используемый провайдер - мегафон (не смейтесь только, другим интернетом не располагаю в данный момент). В Counter-Strike и World of Tanks через него играю свободно (ну, относительно, пинг высоковат... но дело не в этом), а они работают на UDP протоколе. Т.е. проблема решаема, просто я не знаю где и с чего начать поиск. Мне нужна только теория, ненужно исходных кодов (хочу разобраться, хотя если есть исходники - тоже не откажусь). Буду очень признателен если поможете, форумчане. зыЖ сервер и клиенты общаются по локальной сети вполне себе успешно, хотя сервер нужно переделывать... При количестве клиентов 2+ данные клиентам отправляются ну очень уж долго. Знаю из за чего, но сейчас не это основная проблема. Хотя бы двух людей соединить через тырнет для начала - и можно будет работать дальше... |
Ответ: Сеть в играх.
Дело в том, что у тебя локальная сеть, поэтому, когда клиент обращается к серверу по ip, непонятно, какому компьютеру из локальной сети передавать запрос. Для этого в роутерах есть возможность перенаправлять порты порты (forwarding). Гуглишь гайд для своего роутера (или разбираешься сам) и настраиваешь перенаправлание на нужный тебе внутренний ip.
К примеру, в моей UDP-поделке сервер использует порт 25565, в роутере настроено перенаправление на внутренний IP 192.168.1.100 |
Ответ: Сеть в играх.
Объясните как с помощью линейного метода устранить эффект запаздывания.
Цитата:
|
Ответ: Сеть в играх.
Цитата:
|
Ответ: Сеть в играх.
Вложений: 1
|
Ответ: Сеть в играх.
Crayzi, большое спасибо за указание на этот враппер! Ответ от сервера пробился даже через два роутера со стороны клиента! Жалко нельзя ставить сотню спасибок, поставил бы сразу! :)
|
Часовой пояс GMT +4, время: 17:48. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot