Форум: "Прочее";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизПомогите построить систему Клиент-Сервер для сетевой игры. Найти похожие ветки
← →
@!!ex © (2008-02-21 12:55) [0]Есть игра - авиа-аркада.
Сейчас внедряем мультиплеер, я здесь уже вопросы связанные с этим задавал.
Собственно проблема в том, что я все еще не представляю систему целиком.
Очень не хочется сделать систему, которая будет работать криво...
Поэтому привожу свое видение системы, поправьте, плиз, что не корректно.
Сервер:
Хранит список всех объектов.
Хранит зеркало объектов на клиентах. Зеркало нужно, чтобы при отсылке данных на клиент, отсылать только объекты, которые обновились.
Сервер отвечает за создание и удаление объектов. Клиенты сами объекты не создают(например,клиент при выстреле ракеты посылает сообщение серверу о том, что необходимо создать ракету). При создании объекта на клиенты отсылается информация о новом объекте.
Клиент:
Хранит все объекты, список идеентичен списку на сервере и периодически обновляется.
Все кроме самолета игрока при поступлении данных сервера обновляется. Тоесть, есть ракета, она летит к цели, перемещается, вращается. ПРиходит обновление данных о ракете с сервера, естественно положение ракеты в данных отличается от положения на клиенте, но т.к. у сервера приоритет выше, то ракете выставляется положение пришедшее с сервера. И так со всем объектами. По идее при хорошем пинге, проблемы несоответствия визуально не должны быть заметны.
Т.к. самолет игрока рулится на клиенте, то с ним обратная ситуация. На сервер каждый тик приходят данные о самолете(положение, вращение, скорость и т.д.) и сервер их обновляет в соотвтествие с полученными данными от клиента. Только жизнь рулится на сервере.
Также клиенты сообщают серверу о попаданиях из пушки. Тоесть если игрок клиента попал в какую то цель, то на клиенте это не отрабатывается, а данные уходят на сервер, сервер обратаывает попадание(уменьшает жизнь объекта), и отсылает всем клиентам новое состояние объекта(с уменьшенной жизнью).
← →
Rouse_ © (2008-02-21 13:05) [1]Сервер должен только сказать что ракета А пошла в точку Б. И если нет изменений - клиент, зная скорость и направление сам все рассчитывает. То же и с кораблями - указывается вектор движения и скорость - клиент рассчитывает все это и отображает до тех пор пока не пришли изменения траетктории от сервера. Как-то так. Т.е. сервер координатор, а все рассчеты на клиентов. Ненужно так не любить сервер чтоб его нагружать :) Я обычно пытаюсь разгрузить все мои сервера по максимому. Это будет сразу плюс, т.к. позволяет работать одновременно с большим кол-вом клиентов. Правда у моих серверов несколько другая специфика :)
← →
wicked © (2008-02-21 13:06) [2]пакетам с состоянием обьекта проставлять таймстампы, тогда не будет мучений по поводу того, у кого данные по обьекту новее
да и пакеты не всегда приходят в том порядке, в котором их отослали.... это я про UDP
также такая вещь поволит экстраполировать положение обьектов в пространстве, если сеть начнет лагать
(всё имхо и теория, ничего такого на практике не писал)
← →
@!!ex © (2008-02-21 13:08) [3]> [1] Rouse_ © (21.02.08 13:05)
Просто сервер все равно выступает в роли игрока, так что расчет один фиг проводить.
Но приоритет данных сервера позволит избежать десинхронизации... мне так кажется.
Тоесть:
Есть ракета.
Она летит в точку А.
Она летит и на сервере и на клиенте.
Но полет на клиенте периодически корректируется данными приходящими с сервера.
← →
@!!ex © (2008-02-21 13:10) [4]> [2] wicked © (21.02.08 13:06)
Использовать планируется TCP.
Понятно, что при игре по модему все сдохнет, из-за потери пакетов.
Но и цели сделать игру для нета - не преследуется, а в локалке скорости должно хватить, чтобы все нормально работало.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c