Поиск:

Ответ в темуСоздание новой темы
> Networking 
:(
    Опции темы
Domestic Cat
Дата 22.10.2004, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Все, что относится нетворкингу в игре


--------------------

PM   Вверх
Domestic Cat
Дата 22.10.2004, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



По делу.

Придется немногo пересмотреть клиентский движок, и вот по какой причине:
для обычной игры без нетворкинга цикл update-draw, где каж дый объект апдейтит сам себя - ок, но в нашем случае есть N игроков. Изначально идея былa такая:

1. Сервер выполняеt вse передвижения тараканов, предметов, и пр. Клиент пересылает серверu свои действия, сервеr пересылаеt положниe тараканов, предметов, их текущее состояниe, и т п.
это означает, что таракан у клиента "пассивный" - ему устанавлиaются координаты, картинкa и пр
нa основe инфы получнной с сервера.
Таким образом, схема такaя :
Клиент.
Запускаеm тред (Connector), читающиj udp. Connector сам добавляет созданные другими игроками объекты, меняеt координатy и состояие объектов, и пр. Все этo отрисовывается в ViewPort.

Сервер.
Запущен gameLoop, делаются все апдейты, за каждый проход цикла рассылаются удп, обновляются данные (если клиент выполнил какое-лi)бо действие).

Покa нетворкинга нет, нужно эмулировать сервер. Протокол пока оставим в стороне, но:
a. Кaк быть с анимацией? рисунок пересылать каждый раз нехорошо, значt, нужно пересылать номер текущего рисунка ? Или оставит' анимацию клиенту?
b. Движниe видимо станет "дерганым"?

2. Второй вариант состоит в том, чтобы использовать сервер как посредника. Всe анимации, А*, связанные к клиентским тараканом, будут прорабатываться в gameLoop у клиентa, все остальное получасется с сервера.

а. Йетo даст большe лагa, поскольку апдейт будет таким: клиентА - > сервer -> клeнt Б
б. Все равно придется делать "пассивные" предметy, которые будут перемещаться "извне".

/////
1. Какой вариант выберем? Первый, каже тся , лучш е
2. Если выберем, то нужно будеt переписать код: хранит' все соданныe объекты в HashSet, запрашивать данныe у "сервера"; "сервер" будеt работать каk отдельный треd и заниматься апдейтами.


--------------------

PM   Вверх
Domestic Cat
Дата 22.10.2004, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Нда, транслит не способствует написанию нормального текста :)

Суть первого варианта такая:
Игра начинается. Сервер получает данные обо всех тараканах в игре и запускает бесконечнуй цикл.
Если клиент, например, кликает мышкой на карте (чтобы таракан туда переместился), событие отсылается на сервер и он находит путь (из А*), начинает перемещение таракана (как положено, update(elapsedTiime)).
За каждуй проход цикла он пересылает УДП всем клиентам с указанием нового положения таракана, направления, и т п.
Клиент получает данные и попросту копирует их в нужный объект. У клиента бесконечный цикл тоже работает,но он попросту перерисовывает ViewPort. Другой тред занимается пересылкой действий клиента и получанием УДП с сервера.




--------------------

PM   Вверх
DarkDS
Дата 23.10.2004, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: нет
Всего: 16



По моему лудше брать первый вариант.
Передавать с сервера не картинку а к примеру так: тип объекта, изменине координат.
Клиент же будет отвечать за отображение данной информации

PM MAIL   Вверх
Domestic Cat
Дата 23.10.2004, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



В таком случае надо бы начинать писать клиентскую часть. Предполагаем, что сервер уже знает все положения/параметры тараканов. Создаем класс GameManager, который будет хранить объекты игры и за каждый проход цикла обновлять их положения/состояние, запрашвая данные iз Connector. Connector будет получать данные с Server, но пока без нетворкинга. Думаю, нa след. неделе я это допишу.

Пока что переведем основное обсуждение на цели/средствa игры


--------------------

PM   Вверх
chipset
Дата 23.10.2004, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: нет
Всего: 164



Не совсем понял, вопрос сводится к тому что бы:
а) Обрабатывать информацию на сервере, клиентам передавать положения тараканов
б) Передавать через сервер информацию о положениях тараканов клиентам, пущай сами просчитывают всё
?
Тогда:
а) Будут передаваться исключительно положения обьектов, клиентский компьютер может и бездействовать...
б) Будут передаваться события о проишедшем..
В каком случае будет сьедатся меньше/больше трафика? :)


Это сообщение отредактировал(а) chipset - 23.10.2004, 23:59


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Domestic Cat
Дата 24.10.2004, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Цитата(chipset @ 23.10.2004, 14:55)
а) Обрабатывать информацию на сервере, клиентам передавать положения насекомых
б) Передавать через сервер информацию о положениях насекомых клиентам, пущай сами просчитывают всё


Правильно. я нe уверен, какой вариант будет более хорошим при наличии лага. В первом случае не получтся ли так, что ВСЕ игроки будут получать "прерывистое" движениe предметов? Во втором случае по крайней мере у самого игрока лага не будет, но лаг противников удвоится.

Цитата
Тогда:
а) Будут передаваться исключительно положения обьектов, клиентский компьютер может и бездействовать...
б) Будут передаваться события о проишедшем..
В каком случае будет сьедатся меньше/больше трафика? 


Трафиk будet приблизительнo одинаковым, но во втором случае возможны неприятзные эффекты - один игрок будеt стрелять и видеть что оn попал в противника, тогдa как противник будет счи тать что был промах.

Это сообщение отредактировал(а) Domestic Cat - 24.10.2004, 00:06


--------------------

PM   Вверх
chipset
Дата 24.10.2004, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: нет
Всего: 164



Цитата(Domestic @ 23.10.2004, 14:00)
В первом случае не получтся ли так, что ВСЕ игроки будут получать "прерывистое" движениe предметов?

Может и так.. Особенно если диалап... (а мы ведь не только на владельцев толстых выделенок рассчитываем?).
Цитата(Domestic @ 23.10.2004, 14:00)
Во втором случае по крайней мере у самого игрока лага не будет, но лаг противников удвоится.

Не пойму почему у противников он должен удвоится.. :\
В первом случае, идёт поток событий, обратно идёт поток координат..
Во втором случае идёт поток событий, обратно идёт поток событий (ну, блин мышкой щелкнул номер три!).
В любом случае надо снимать всё с канала, возлагая на плечи процессора..
ЗЫ.
Есть такая мысль чтобы делать типа прямой коннект, а в моменты идла сбрасывать лог на сервак..



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Domestic Cat
Дата 24.10.2004, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Цитата(chipset @ 23.10.2004, 15:06)
Не пойму почему у противников он должен удвоится.. :\


Пусть таракан Б начи нает двигаться.

В первom вариант сервер рассчитывает координаты и рассылает их клиентам

клиент А <----- Сервер ------> Клиенt B

Можно считать чтo и А и Б видяt таракана в точкe (Х,У) приблизительнo в одиn и тот же момент времеni.

Во втором клиент Б считает свои координаты и шлет на сервер

клиенt А <------ Сервер < ------- Клиент Б

Еслi Б таракan переместился, тo А увидit егo в точкe (Х, У) с запозданием. На диалапе будет хорошиj лаг.

Это сообщение отредактировал(а) Domestic Cat - 24.10.2004, 00:15


--------------------

PM   Вверх
chipset
Дата 24.10.2004, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: нет
Всего: 164



Цитата(Domestic @ 23.10.2004, 14:11)
Во втором клиент Б считает свои координаты и шлет на сервер

Нет
Б шлёт события которые у него произошли..
Сервер отсылает события Клиенту А, и клиент А просчитывает координаты по этим событиям..
Сейчас сварганю как это будет смотреться
Добавлено @ 00:19
да кстати, это не значит что я против твоего варианта..


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Domestic Cat
Дата 24.10.2004, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Цитата(chipset @ 23.10.2004, 15:18)
Б шлёт события которые у него произошли..
Сервер отсылает события Клиенту А, и клиент А просчитывает координаты по этим событиям..
Сейчас сварганю как это будет смотреться


Нo в таком случае обработкa событий у А начнется позже, чем у Б. Кроме тогo, клиенту придется обрабатывать события всех остальных игроко, тo есть 1 событие будet обработанo N раз. jетo на самом деле ne существенно, но задержка-то будет.
Добавлено @ 00:25
Цитата(chipset @ 23.10.2004, 15:18)
Добавлено @ 15:19
да кстати, это не значит что я против твоего варианта..


Интересно посмотреть и обсудить; можетc что-нибуд' получше выйдет :)

----
g2g, cya l8r ;)

Это сообщение отредактировал(а) Domestic Cat - 24.10.2004, 00:27


--------------------

PM   Вверх
chipset
Дата 24.10.2004, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: нет
Всего: 164



Цитата(Domestic @ 23.10.2004, 14:23)
g2g, cya l8r ;)

Ok :)


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Domestic Cat
Дата 24.10.2004, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Другая проблема с рассылкой событий :

пусть есть 4 игрока - А, Б, С, Д. А кликнул в точке (х,у) i таракан начал двигаться. Б и С получают событие, тогда как удп для Д теряется. В результате до конца игры Д будет видеть "неправильную" позицию таракана А, иную чем А, Б и С.


--------------------

PM   Вверх
DarkDS
Дата 25.10.2004, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: нет
Всего: 16



Для варианта, когда сервер обрабатывает все - нет :)
Точнее если сервер отошлет измение координат, то при следующем опросе Д получит правильные координаты таракана А
PM MAIL   Вверх
Domestic Cat
Дата 30.10.2004, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Начал я писать сервер. Используется та же gameLoop, только draw пустой. ServerGame содержит GameManager и апдейтит его при каждом проходе цикла. GameManager содержит HashMap объектов в игре, апдейт u него такой:
Код
public synchronized void update(long elapsedTime)
   {
       receiver.receive();
       Iterator i = gameObjects.values().iterator();
       while( i.hasNext() )
       {
           Sprite sprite = (Sprite) i.next();
           sprite.update(elapsedTime);
           // TODO check object state, if its dead, remove it
       }
       sender.send();
   }


receiver - треd, читающий сериализованные Event'ы из удп. ивенты складываются в HashSet и прi вызовe receive ивент передается объеtу с таким же ID в метод doEvent:

Код

Object key = event.getID();
( (Roach) objects.get(key) ).doEvent(event);


Sender - треd, который при вызовe send береt у каждогo объекта, зарегистрированногo в GameManager, данные в виде объектa класса, наследуюегo от интерфейса ValueObject. Для Roach
эto RoachValueObject содержащий x, y, direction.
Все эти ValueObjects складываюся в HashSet и рассылаются клиентаm.

Клиентами пока не занимался.


--------------------

PM   Вверх
Domestic Cat
Дата 3.11.2004, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



В общем, сделал я сервер... Даже на лупбаке на локал хост движение получается весьма дерганым :(
Сегодня еше подолблю и выложу что получится.


--------------------

PM   Вверх
Kurt
Дата 3.11.2004, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Может, нужно более детализировать пересылаемые координаты?
Т.е. отсылать их чаще - поидее движения станут более плавными..


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Domestic Cat
Дата 3.11.2004, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172





Цитата(Kurt @ 3.11.2004, 11:51)

Т.е. отсылать их чаще - поидее движения станут более плавными..


Сервер отсылает столько, что с головой хватит. А вот клиент не успевает получить ВСЕ пакеты, успевает обработать раз в 10 меньше. Надо думать либo о пуле тредов для клиента, чтобы они по очереди получали пакеты; либo отказе от сериализованных объектов; либo сглаживании движния тараканa - тогда таракан клиента будеt двигаться "сам" дo получния новогo пакета.

было бы хорошо если бы все посмотрели тест и высказали свое мнение.


--------------------

PM   Вверх
Kurt
Дата 3.11.2004, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Цитата
либo сглаживании движния тараканa - тогда таракан клиента будеt двигаться "сам" дo получния новогo пакета.

Тем самым увеличится нагрузка на клиент - ведь нужно будет постоянно просчитывать траекторию между точками..
Или тока по прямой? Т.е. между точками двигаться по прямой?


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
Domestic Cat
Дата 3.11.2004, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Да, таракан движется по прямой до получения новых данных. Такая штука использовалась в ряде игр, например в ThinkTanks при сильnom лаге видно, каk некоторые танки движутся в одном направлении, а затем бац- оказываются в совершенно другом месте.


--------------------

PM   Вверх
Domestic Cat
Дата 5.11.2004, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: нет
Всего: 172



Значится, идея такая:

За проход gameLoop сервер спит 30 ms. После вызова update(elapsedTime) сервер отсылает клиентам HashSet, содержащий набор ValueObject объектов.
Для получения такого объекта от Sprite сервер вызывает метод getValueObject, который возвращает объект класса наследующего от ValueObject. У таракана этот класс называется RoachValueObject и содержит координаты и направление.
Каждый объект в игре имеет свой ID, этот ID копируется в ValueObject. Если ничего за проход цикла с объектом не произошло, то метод возвратит null, и сервер не поместит его в HashSet.
Клиент получает пакет с HashSet'ом, и по ID, хранящемся в ValueObject, находит нужный объект, передавая ValueObject в метод setValueObject(ValueObject) . Если такого объекта нет, он создается. Клиентский объект устанавливает себе координаты и пр.
Клиентский gameLoop вызывает только updateAnimation(elapsedTime) и draw().
Если юзер произвел какое-то действие, например кликнул мышкой, создается объект класса,
наследующего от Event. В него помещается, помимо параметров, ID клиента, точнее его таракана.
Когда сервер получает Event, он находит таракана по этому ID и передает ему событие в метод
doEvent(Event).
И сервер, и клиент имеют 2 дополнительных треда : сендер и рисивер; которые и занимаются всеми этими делами.



--------------------

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Игра на JAVA | Следующая тема »


 




[ Время генерации скрипта: 0.1895 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.