Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
6-1173711468
Saint-Virus
2007-03-12 17:57
2008.04.06
решил написать своего DC++ клиента


2-1204887929
Прохожий 001
2008-03-07 14:05
2008.04.06
Три окна и GW_HWNDPREV


15-1203697665
kernel
2008-02-22 19:27
2008.04.06
record => PHP


2-1205488494
Student :)
2008-03-14 12:54
2008.04.06
как работать с MSXML через прокси?


2-1205177434
Бэтман
2008-03-10 22:30
2008.04.06
edit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский