Поиск:

Ответ в темуСоздание новой темы
> 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   Вверх
Ответ в темуСоздание новой темы
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Игра на JAVA | Следующая тема »


 




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


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

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