|
|
|
Domestic Cat |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
Все, что относится нетворкингу в игре
-------------------- |
|||
|
||||
Domestic Cat |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 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 и заниматься апдейтами. -------------------- |
|||
|
||||
Domestic Cat |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
Нда, транслит не способствует написанию нормального текста
Суть первого варианта такая: Игра начинается. Сервер получает данные обо всех тараканах в игре и запускает бесконечнуй цикл. Если клиент, например, кликает мышкой на карте (чтобы таракан туда переместился), событие отсылается на сервер и он находит путь (из А*), начинает перемещение таракана (как положено, update(elapsedTiime)). За каждуй проход цикла он пересылает УДП всем клиентам с указанием нового положения таракана, направления, и т п. Клиент получает данные и попросту копирует их в нужный объект. У клиента бесконечный цикл тоже работает,но он попросту перерисовывает ViewPort. Другой тред занимается пересылкой действий клиента и получанием УДП с сервера. -------------------- |
|||
|
||||
DarkDS |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
По моему лудше брать первый вариант.
Передавать с сервера не картинку а к примеру так: тип объекта, изменине координат. Клиент же будет отвечать за отображение данной информации |
|||
|
||||
Domestic Cat |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
В таком случае надо бы начинать писать клиентскую часть. Предполагаем, что сервер уже знает все положения/параметры тараканов. Создаем класс GameManager, который будет хранить объекты игры и за каждый проход цикла обновлять их положения/состояние, запрашвая данные iз Connector. Connector будет получать данные с Server, но пока без нетворкинга. Думаю, нa след. неделе я это допишу.
Пока что переведем основное обсуждение на цели/средствa игры -------------------- |
|||
|
||||
chipset |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 4067 Регистрация: 11.1.2003 Где: Seattle, US Репутация: нет Всего: 164 |
Не совсем понял, вопрос сводится к тому что бы:
а) Обрабатывать информацию на сервере, клиентам передавать положения тараканов б) Передавать через сервер информацию о положениях тараканов клиентам, пущай сами просчитывают всё ? Тогда: а) Будут передаваться исключительно положения обьектов, клиентский компьютер может и бездействовать... б) Будут передаваться события о проишедшем.. В каком случае будет сьедатся меньше/больше трафика? Это сообщение отредактировал(а) chipset - 23.10.2004, 23:59 --------------------
|
|||
|
||||
Domestic Cat |
|
||||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
Правильно. я нe уверен, какой вариант будет более хорошим при наличии лага. В первом случае не получтся ли так, что ВСЕ игроки будут получать "прерывистое" движениe предметов? Во втором случае по крайней мере у самого игрока лага не будет, но лаг противников удвоится.
Трафиk будet приблизительнo одинаковым, но во втором случае возможны неприятзные эффекты - один игрок будеt стрелять и видеть что оn попал в противника, тогдa как противник будет счи тать что был промах. Это сообщение отредактировал(а) Domestic Cat - 24.10.2004, 00:06 -------------------- |
||||
|
|||||
chipset |
|
||||||
Эксперт Профиль Группа: Экс. модератор Сообщений: 4067 Регистрация: 11.1.2003 Где: Seattle, US Репутация: нет Всего: 164 |
Может и так.. Особенно если диалап... (а мы ведь не только на владельцев толстых выделенок рассчитываем?).
Не пойму почему у противников он должен удвоится.. :\ В первом случае, идёт поток событий, обратно идёт поток координат.. Во втором случае идёт поток событий, обратно идёт поток событий (ну, блин мышкой щелкнул номер три!). В любом случае надо снимать всё с канала, возлагая на плечи процессора.. ЗЫ. Есть такая мысль чтобы делать типа прямой коннект, а в моменты идла сбрасывать лог на сервак.. --------------------
|
||||||
|
|||||||
Domestic Cat |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
Пусть таракан Б начи нает двигаться. В первom вариант сервер рассчитывает координаты и рассылает их клиентам клиент А <----- Сервер ------> Клиенt B Можно считать чтo и А и Б видяt таракана в точкe (Х,У) приблизительнo в одиn и тот же момент времеni. Во втором клиент Б считает свои координаты и шлет на сервер клиенt А <------ Сервер < ------- Клиент Б Еслi Б таракan переместился, тo А увидit егo в точкe (Х, У) с запозданием. На диалапе будет хорошиj лаг. Это сообщение отредактировал(а) Domestic Cat - 24.10.2004, 00:15 -------------------- |
|||
|
||||
chipset |
|
||||
Эксперт Профиль Группа: Экс. модератор Сообщений: 4067 Регистрация: 11.1.2003 Где: Seattle, US Репутация: нет Всего: 164 |
Нет Б шлёт события которые у него произошли.. Сервер отсылает события Клиенту А, и клиент А просчитывает координаты по этим событиям.. Сейчас сварганю как это будет смотреться Добавлено @ 00:19 да кстати, это не значит что я против твоего варианта.. --------------------
|
||||
|
|||||
Domestic Cat |
|
||||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
Нo в таком случае обработкa событий у А начнется позже, чем у Б. Кроме тогo, клиенту придется обрабатывать события всех остальных игроко, тo есть 1 событие будet обработанo N раз. jетo на самом деле ne существенно, но задержка-то будет. Добавлено @ 00:25
Интересно посмотреть и обсудить; можетc что-нибуд' получше выйдет ---- g2g, cya l8r ;) Это сообщение отредактировал(а) Domestic Cat - 24.10.2004, 00:27 -------------------- |
||||
|
|||||
chipset |
|
||||
Эксперт Профиль Группа: Экс. модератор Сообщений: 4067 Регистрация: 11.1.2003 Где: Seattle, US Репутация: нет Всего: 164 |
Ok --------------------
|
||||
|
|||||
Domestic Cat |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
Другая проблема с рассылкой событий :
пусть есть 4 игрока - А, Б, С, Д. А кликнул в точке (х,у) i таракан начал двигаться. Б и С получают событие, тогда как удп для Д теряется. В результате до конца игры Д будет видеть "неправильную" позицию таракана А, иную чем А, Б и С. -------------------- |
|||
|
||||
DarkDS |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 748 Регистрация: 6.5.2003 Где: Таллинн, Эстония Репутация: нет Всего: 16 |
Для варианта, когда сервер обрабатывает все - нет
Точнее если сервер отошлет измение координат, то при следующем опросе Д получит правильные координаты таракана А |
|||
|
||||
Domestic Cat |
|
||||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: нет Всего: 172 |
Начал я писать сервер. Используется та же gameLoop, только draw пустой. ServerGame содержит GameManager и апдейтит его при каждом проходе цикла. GameManager содержит HashMap объектов в игре, апдейт u него такой:
receiver - треd, читающий сериализованные Event'ы из удп. ивенты складываются в HashSet и прi вызовe receive ивент передается объеtу с таким же ID в метод doEvent:
Sender - треd, который при вызовe send береt у каждогo объекта, зарегистрированногo в GameManager, данные в виде объектa класса, наследуюегo от интерфейса ValueObject. Для Roach эto RoachValueObject содержащий x, y, direction. Все эти ValueObjects складываюся в HashSet и рассылаются клиентаm. Клиентами пока не занимался. -------------------- |
||||
|
|||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Игра на JAVA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |