Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

Сетевая игра. BCB6   Найти похожие ветки 

 
megabyte-ceercop ©   (2005-12-12 07:21) [0]

Привет всем.
Недавно увидел сетевого бомбермена, вот теперь уже окончательно понял что без сетевого варианта - игра не будет по-настоящему цепляющей : )

Ищу инфу по сетевому обмену. Игровой механизм уже продумал и реализовал. Теперь хочу сделать правильно Сетевой обмен.

Игра на два компа в локалке.
Обмен состоянием клавиш идет в каждом пакете. Плюс небольшими порциями передаются куски для синхронизации миров.

Интересуют такие вопросы:

Какой механизм (компоненту) использовать для соединения, с передачей данных в обоих направлениях, (желательно самую низкоуровневую)?

Кокого размера буфер лучше передавать и как часто?
(из пределов 1-25кб  /  20-50pps)

С какой частотой можно передавать буфер в 25кб не перегружая сетку (100Mb/s)? (25 кб - это полное описание всего мира без ландшавта (всех спрайтов), было бы не плохо просто клиенту копировать мир с сервака.)

Порт с номером из какого диапазона лучше пользовать?

Как получить список компов в локальной сети на которых открыты сервера игры, или хотя бы просто список всех компов в локалке?

Я по сетке вобщем ламак. Пытался делать поиск все запросы нулевые.

Как только реализую, выложу обновленную Альфу Киркопа III с сетевой игрой :)

Помогите кто знает.


 
П7   (2005-12-12 11:16) [1]

1. Где ты видел низкоуровневые  компоненты? (:
2. Оптимайзить и ещё раз оптимайзить. 25кб можно сильно ужать, или передавать мир частями в тот момент, когда он изменяется.
3. Учится работать с поиском. Нулевыми они не могут быть.
4. Читать форум "Сети".
5. Порт юзать больше 1024.


 
megabyte-ceercop ©   (2005-12-12 12:29) [2]

Я тут потестил немного.
Пакет 7Кб мне понравился. При стабильном конекте 3мс на передачу уходит.

7к будет передаваться только в одном направлении, обратно сервак получает только 1 байт инфы о клавишах.

А где посмотреть пример правильного установления и разрыва соединения.
У меня вроде получается, но как-то все просто слишком :)

Еще такой косяк наблюдается - запускаю два экземпляра игры сервак и клиент. На серваке управляю героем на клиенте все тоже самое происходит, но вот примерно через минуту клиент начинает отставать на полсекунды примерно в действиях героя. Похоже  сервак пишет немного чаще чем клиент считывает. Чтение запись и там и там у меня просто по таймеру с одинаковым интервалом.
Нужен пример синхронизации сервера и клиента в исходниках желательно:), чтобы например при отправке каждого пакета с сервера на клиенте вызывался обработчик события. TClientSocket имеет вроде такое событие вот только оно не срабатывает ни в какую.

Есть ли у кого описание TServerSocket TClientSocket с примером, и стоит ли использовать именно эти компоненты? МОжет есть чтото быстрее и удобнее? :)


 
megabyte-ceercop ©   (2005-12-12 12:44) [3]

ого :) Похоже я зря боялся за перегрузку сети : ) подключение 100Мбит  при отправке 20 пакетов в секунду размером в 7 Кб каждый - загрузка сети меньше 3%  :)
Может я конечно неправильно измеряю :)?


 
_Lucky_   (2005-12-12 13:43) [4]

http://www.gamedev.ru/articles/?sect=8


 
WondeRu ©   (2005-12-12 14:11) [5]

DirectPlay - специально для этого придуман


 
П7   (2005-12-12 14:35) [6]


> WondeRu ©   (12.12.05 14:11) [5]

В топку! (:


 
megabyte-ceercop ©   (2005-12-12 14:54) [7]

Читал о возможностях DirecPlay. Оно и само регестрирует созданые игры и само их ищет для клиента и много много чего.
Но для игры камп<->комп это лишнее.
Не хочется просто продумывать взаимодействие со всем этим из скриптового языка.

У меня уже есть в движке поддержка двух игроков на одной клаве, хочу просто сделать чтобы движок не видел разницы двое с одного компа управляют или с разных в сети, чтобы ничего больше в логике не переделывать. : )


 
cyborg ©   (2005-12-12 16:25) [8]

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

Во первых, желательно ориентироваться на модемную связь. Грубо говоря 4 килобайта в секунду, не больше. 200 байт за пакет. В эти 200 байт можно ужать много полезной информации. Основное, это координаты важных объектов. Т.е. других игроков и близлежащих врагов (можно всех). Остальное (анимации всякие) не обязательно и передавать, а о состояниях дверей или ещё каких нибудь ключевых вещей можно передавать один раз при их изменении.

Если у тебя получится воплотить это в игру, то крайне любопытно было бы почитать об этом. ;)


 
П7   (2005-12-12 17:05) [9]

При одинаковом подходе тормоза возникают при использовании TCP. При юзании UDP возникают сложности другого плана.


 
megabyte-ceercop ©   (2005-12-13 14:40) [10]

Ну я вобщем вчера вечером покопался немного.
Сделал так:

С сервера по таймеру с интервалом 50мСек передаются пакеты 7кб.
В каждом пакете клавиши сервера и 1/4 часть мира которая на клиенте вставляется в нужное место. Т.е. мир полностью синхранизуется за 4 прохода.  В пакетах инфа о координатах скорости цвете всех спрайтов. Текущии позиции для обработки алгоритмов каждого спрайта и.т.д. Промежуточные фреймы расчитываются уже клиентом самостоятельно инфы для этого достаточно.
7кб x 20 в секунду при таком обмене все идет абсолютно гладко без скачков. Игра динамичная - там Киркопы (Да пришлось пока двоих киркопов гонять. , ^_^ потом заменю на девочку - его подружку :) ) Киркопы носятся как угорелые всеравно все гладко и синхронно :) Если что можно будет с интервалом отправки и размером пакета по экспереминтировать и снизить нагрузки на сеть.

На клиенте в отдельном потоке запущена процедура непрерывного чтения из сокета. Таким способом отставание которое появлялось раньше через минуту - исчезло ваще:) На картинках сервера и клиента действия абсолютно синхронны.

С клиента сейчас в ответ на каждый пакет сервера отправляю 1 байт с инфой о состоянии клавиш, вот с чтением этого байта на серваке сегодня постараюсь разобраться, что-то немного нестабильно, похоже из-за обращения к сокету из двух Thread`ов одновременно. Попробую семафор.

На счет ужатия инфы, можно конечно ужать, но хочется иметь просто две абсолютных копии мира. По нету конечно играть не получится, расчитываю только не локалку, даже на 10кбитах по расчетам должно работать без лагов :)

Пока еще не делал синхронизацию загруженых карт и передачу сообщений по чату, но главное думаю сейчас с самой игрой разобраться.

Ну пока. Сегодня вечером дома посмотрим что получится. На работе с Киркопом завязал :)


 
megabyte-ceercop ©   (2005-12-14 07:20) [11]

ммм. Привет всем, еще раз.

Вот на такую проблему натолкнулся:
При передаче данных в одном направлении (с сервака на клиент) все ок.
Но стоит только отправить хоть один байт в обратном направлении - серверная часть начинает виснуть и занимать 99% производительности проца.
Из-за чего такое может быть?? : |
Я для эксперимента просто по нажатии кнопки на клиенте пишу в сокет один байт и все, а сервак сразу затормаживается. Читаю этот байт - тормозит, не читаю - тоже тормозит. Значит тут дело не в процедуре считывания этого байта, а в чем-то другом.
И еще, что означает свойство tServer\ClientSocket->SocketType (Blocken\nonBlocket)?? Я в блокет его поставил.

Может эти компоненты не подходят для двустороннего обмена?? Хотя это глупость конечно.
Я уже думаю о том, что придется второе соединение устанавливать - для обратной передачи данных.


 
cyborg ©   (2005-12-14 09:07) [12]


> Но стоит только отправить хоть один байт в обратном направлении
> - серверная часть начинает виснуть и занимать 99% производительности
> проца.
> Из-за чего такое может быть??

Скорей всего у тебя неправильно это дело обрабатывается. Цикл может какой крутится?


> И еще, что означает свойство tServer\ClientSocket->SocketType
> (Blocken\nonBlocket)??

Это в каком режиме работает соединение. В блокирующем режиме пока не отошлются или не примутся данные, передача управления на следующий оператор не произойдёт. Т.е. твоя программа приостановится, ожидая завершение приёма/передачи.


 
megabyte-ceercop ©   (2005-12-14 09:54) [13]


> cyborg [12]


ок. С блокированием ясно. сделаю значит нонБлокинг :)
может и тормоза пропадут я не пробовал почемуто ^_^

Ну ладно. Буду по-тихой разбираться.
Буду держать все в курсе.


 
megabyte-ceercop ©   (2005-12-27 07:48) [14]

Всем привет.
Рассказываю : )

С двустроронней передачей данных по одному TCP подключению так ничего и не вышло. Если делать блокирующий сокет, то игра повисала про отправке хоть одного байта в обратном направлении, а если неблокирующие - отправка идет нормально, но картинки рассинхронизировались и действия героя обрывались скачками.

Прочитал про UDP переделал все полностью на DataGrams, думал будет работать быстрее, ведь протокол легче по идее. Но не тут-то было при отправке по UDP комп ваще стал 100% CPU забирать. Но чем UDP понравился - это поиск серверов игры в локалче через BroadCast. И еще через него очень легко сделать Внутренний чат и обмен текстовыми командами по подгрузке уровней и воспроизведению музыки.
В результате:
UDPServer UDPClient + TCPServer TCPClient (блокирующие поток).
В начале по удп клиент посылает широковещательную датаграмму сервера отвечают отсялая свой хост. Клиен берет понравившийся и отправляет ему подтверждение IJoin. После чего устанавливается TCP соединение,  двойное причем. Для отправки данных в обоих направления. В процессе игры по UDP буду передаваться единовременные команды и сообщения чата, но это еще доработаю. Вот. Вроде теперь все летает, и компы в локалке находят друг друга без проблем :)

Непонятно только почему отправка тех же самых данных, в том же количестве но через UDP так сильно тормозит, когда по TCP ваще 1% загрузки?? : |


 
Da Stranger ©   (2005-12-27 12:33) [15]

Интересно, а что такое двойное соединение по TCP?..


 
megabyte-ceercop ©   (2005-12-28 06:36) [16]


> Da Stranger ©   (27.12.05 12:33) [15]


Ну в смысле два соединения.

На каждом экземпляре игры есть tTCPсервер и tTCPклиент.
Клиент первого подключается к серверу второго, а клиент второго к серверу первго. Получается два сокет-соединения, по каждому соединению передача данных идет только в направлении от компонента tTCPклиент к компоненту tTCPсервер. Потомучто как я уже говорил, если передавать по одному соединению в обоих направлениях, прога виснет если используется сокет блокирующий поток. А если неблокирующий использовать, то не виснет, но опять же картинка на клиентской части игры дергается время от времени.

Сегодня начну реализацию внутриигрового чата.


 
cyborg ©   (2005-12-28 10:08) [17]

[16] megabyte-ceercop ©   (28.12.05 06:36)
По какому-то неверному пути ты пошёл. Скоро у тебя на каждый чих по соединению создаваться будет ;).
Чтобы не заедало, создавай соединение в отдельном потоке. В блокирующем режиме даже нормально работать будет.
И сеть, думаю, лучше на винсок сделать, там очень просто. В сети поищи, есть странички с описанием работы с ними в Дельфи.


 
megabyte-ceercop ©   (2005-12-28 12:04) [18]


> Чтобы не заедало, создавай соединение в отдельном потоке.
>  В блокирующем режиме даже нормально работать будет.

В том то и дело. Именно этот отдельный поток напрочь и виснет. обработка сети прекращается а игры живет дальше.
По винсокам2 искал. Слова что там все просто на каждом шагу, а вот работающего примера так нигде и не нашел. : |
С реализацией сети перебрал конечно несколько вариантов вроде ничего более быстрого простого и надежного не нашел чем та схема по которой сейчас работает. Боялся что не удастся динамику игры сохранить в сетевом варианте. Не ожиданно, но все движется гладко и быстро. :) Скорее бы все красиво обернуть и выложить уже :)


 
cyborg ©   (2005-12-28 13:45) [19]

Мана сенга ;)
http://www.realcoding.net/article/view/1833
Берёшь его примеры и перелопачиваешь под свои нужды.


 
megabyte-ceercop ©   (2006-01-18 13:52) [20]

Привет всем :)
Вот наконец-то с сеткой разобрался, с нуля начал писать скрипт главного героя. Скидал Альфу.
1 сетевой уровень (без геймплея :) Просто бегаешь вдвоем с кем-нибудь соберешь все ключи и в дверь. Киркопы цепляются за края скал руками, немножко прыгают. Толкаются. Громко стукаются головами о пол и стены. Могут мертвую петлю с разбега навернуть в пещере со скруглеными углами и потолком.
Сетевая игра только по локалке. Сперва запускаете игру и жмете кнопку "Сетевая сервер", потом на другом компе запускаете второй экземпляр и жмете "Сетевая клиент". Играете:)
Если нет второго компа, можно суграть с одного, используя одну клаву на двоих. Такой режим на серваке доступен, до тех пор пока клиент не подключится.
Управление:
1Player - Стрелки
2Player - ASDW (как в контре :) )

Альфа на 17 мегов получилась :) Многовато. Незнаю куда кинуть и есть ли смысл ваще. :)
В одиночном режиме два уровня абсолютно лишенные геимплея. Просто демонстрация разных погодных условий :)

Но вот вроде все : )

Вот тут еще скрины. Пока саму дему не выкладываю, незнаю будет  ли кто качать?

http://i4.photobucket.com/albums/y122/Megabyte_CeerCop/CeerCopII-7.jpg
http://i4.photobucket.com/albums/y122/Megabyte_CeerCop/CeerCopII-6.jpg
http://i4.photobucket.com/albums/y122/Megabyte_CeerCop/CeerCopII-5.jpg
http://i4.photobucket.com/albums/y122/Megabyte_CeerCop/CeerCopII-4.jpg
http://i4.photobucket.com/albums/y122/Megabyte_CeerCop/CeerCopII-3.jpg
http://i4.photobucket.com/albums/y122/Megabyte_CeerCop/CeerCopII-2.jpg
http://i4.photobucket.com/albums/y122/Megabyte_CeerCop/CeerCopII-1.jpg

Вот.


 
VAMPiRE   (2006-01-21 00:41) [21]

megabyte-ceercop, почему-же, выкладывай альфу на slil.ru или на rapidshare.de будет рады потестить ;)


 
Megabyte-CeerCop ©   (2006-02-09 11:05) [22]

Привет всем : )
Тут возился с одной продлемой. Разобрасля вот позавчера.
Дело в том, что если я открывал в приложении UDPClient с портом N, чтобы проверить нет ли в сетке запущеных серваков игры, а потом менял порт на N2 чтобы стать серваком самому - UDPсlient продолжал с N работать а на N2 никак не переключался.
Вылечил такой строкой перед присваиванием нового номера порта:
UDPClient->Bindings->clear();
Вот : )

А вот и альфа 18 Метров. Теперь кнопка КЛИЕНТ доступна только если в локальной сети есть сервер.
Можно запустить сервер и клиент на одной машине, но запускайте второй экземпляр игры только после того, как на первом Сервер уже запущен, а то они вместе начнут искать серваки и воспользуются одним и темже портом, а на одной машине это вызовет ошибку (потом обработаю).

http://slil.ru/22551582

Ну, буду рад если кто посмотрит.


 
Megabyte-ceercop ©   (2006-02-09 12:18) [23]

Чуть не забыл, для запуска необходима звуковуха и DX9.
Без этого не запустится.


 
Darthman ©   (2006-02-11 23:21) [24]

Из замеченного сразу.
На первой анимации с рукой почему-то тень от цепи болтается (так задумано)?
При нажатии НАСТРОЙКИ просто вываливается молча


 
Darthman ©   (2006-02-11 23:25) [25]

После нажатия на НАЧАТЬ ИГРУ музыка начала играться раза в два громче.
При свернутой игре почему-то над кнопкой ПУСК у меня появился фиолетовый человечек и висит там во всех приложениях :)

ЗЫ: про управление в игре вообще ничего непонятно.


 
Darthman ©   (2006-02-11 23:29) [26]

Иногда экран дрожит (почему так и не понял) двигаясь то на пиксель вверх, то на пиксель вниз.
Вокруг персонажа иногда возникают куски рамки (плохо вычещены спрайты?)
При нажатии на нампеде кнопки "1" разлетается в разные стороны какая-то розовая дрянь.


 
Megabyte-ceercop ©   (2006-02-13 06:12) [27]

^_^
Настройки и пароль еще не делал совсем. Нажатия на этих кнопках равносильны нажатию по кнопке "выход".

С громкостью незамечал. Посмотрю обязательно что там.
Значек над пуском :) Он и в первом киркопе вылазит всевремя. Незнаю откуда он. Думал стандартная фишка ДирекИкса.

А с управлением там ничего сложного и нет. Пока только стрелки : )

Дрожь бывает когда экран смещается к краю мира. Замечал такое. Тоже разберусь вечером.

Раамки :| Да. Самая большая беда. :| Когда на текстуре с одного бока изображение касается самого края - на противоположном, за счет фильтрации появляется тонкая полоска. Текстуры то циклически закольцованы в Д3Д. :| Может кто знает способ избавиться от этой цикличности текстур. Нехочется терять полоу в один пиксель вокруг на каждой текстуре.

Кнопка "1" Это я просто проверял когда-то работу скрипта на создание новых объектов. Так еще и не удалил : )


 
Sapersky   (2006-02-13 12:47) [28]

Убрать зацикливание текстур:
SetTextureStageState( 0, D3DTSS_ADDRESS, D3DTADDRESS_CLAMP);
или D3DTADDRESS_BORDER.
Может быть стоит установить
SetRenderState(D3DRENDERSTATE_WRAP0, 0);
если перед этим устанавливается не 0.
А вообще см. SDK по теме Texture Adressing Modes / Texture Wrapping


 
Sapersky   (2006-02-13 12:57) [29]

Пардон, это для DirectX7. Для 8-9 стейты могут немного по-другому называться (D3DRS_WRAP0 например).


 
Megabyte-ceercop ©   (2006-02-15 11:51) [30]

:)))) Sapersky Спасибо :) Пойду листать SDK. Чувствую сейчас моя головная боль пройдет наконецто :)


 
Megabyte-ceercop ©   (2006-02-15 12:49) [31]

Stmt->SetTextureStageState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
Stmt->SetTextureStageState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
Stmt->SetTextureStageState( 0, D3DSAMP_ADDRESSW, D3DTADDRESS_CLAMP);
: ) Вот так вечером попробую : )
Точно сработает.
Sapersky спасиба еще раз. Я ведь сидел думал края всех текстур очистить, или текстурные координаты сместить на один пиксель совсех сторон. Хорошо что не сделал этой глупости, так бы до истины и не докопался бы никогда.
А теперь без потерь обойдемся :)
Спа си ба.


 
A22 ©   (2006-02-16 01:23) [32]

если речь о D3D, то указывая текстурные координаты важно знать, как они воспринимаются драйвером: как угол соотв. пикселя или как центр. Делая на D3D gui я избавлялся от рамки на спрайтах путем смещения текстурных координат на половину пикселя (0.5/sprite_width, 0.5/sprite_height)

подобный же финт можно проделать, если поставить флажок в настройках дров (в каталисте я такое видел и делал - помогало), но все же. имхо, лучше реализовать эту фичу руками


 
Megabyte-ceercop ©   (2006-02-16 06:43) [33]

Рамки не будет если снять фильтрацию текстур, но тогда будет негладко.

Если сдвинуть текстурные координаты, то будет потеря в поверхности.

Флажок - не все дрова имеют, и темболее не все пользователи полезут его искать.

Stmt->SetTextureStageState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
Stmt->SetTextureStageState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
Stmt->SetTextureStageState( 0, D3DSAMP_ADDRESSW, D3DTADDRESS_CLAMP);

Вот эти команды переключают текстуры в акой режим, при котором все координаты больше 1.0 и меньше 0.0 будут переадресовываться на 1.0 и 0.0 соответственно (те как бы упираться в край текстуры, а не обходить ее циклически).
Этот способ пра виль ный.
Sapersky cпасиба тебе : )


 
Megabyte-ceercop ©   (2006-02-22 07:50) [34]

Сделал я все как написано в SDK, рамка не исчезла безследно, а только стала тоньше и прозрачнее раза в три. Полного и абсолютного очищения почему-то не получилось. Похоже что фильтрация неправильно CLAMP оьрабатывает, всеравно берет соседние пиксель с противоположной стороны текстуры. Может особенности видеокатры. : |


 
patriot[ru]   (2006-03-09 17:49) [35]

2Megabyte-ceercop
Немного оффтопа-Где-то давно скачивал первого киркопа,ну очень понравилось!Прям и красивая и модельки хорошие и вообще просто класс!
И мне вот интересно стало-её ещё нигде не издавали??Я так думаю,если уровней поболе сделать то её вообще с руками оторвут:)


 
JUS ©   (2006-03-10 01:13) [36]

Хотел скачать, но slil.ru как всегда тормоз! 4:35 приказал качать 5мин стоит на 0%
WebFile.ru нормальный хостинг!


 
a22 ©   (2006-03-13 19:49) [37]

ceercop, простой клэмп и не избавит от рамки, я же писал в [32] - координаты текстурные смести к центру на полпикселя. не (0,0);(1,1) а (dx,dy);(1-dx,1-dy), где dx & dy - половина пикселя по оси Х & Y в текстурных координатах, моему гую такой финт помог


 
Sapersky   (2006-03-16 12:20) [38]

Ну да, только Мелкософт (и я тоже :)) смещает не текстурные координаты, а сами вершины на -0.5. Из переведённого Clootie СD3DFont:

pVertices^ := InitFont2DVertex(D3DXVector4(x+0-0.5,y+h-0.5,0.9,1.0), dwColor, tx1, ty2); Inc(pVertices);


 
Sapersky   (2006-03-16 12:33) [39]

Хотя вывод текста - не тот случай, у спрайтов (букв) края получаются прозрачные, как правило. Может быть, действительно текстурные координаты надо смещать.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.016 c
2-1166995336
Степан
2006-12-25 00:22
2007.01.14
Панель инструментов


15-1166559881
Kolan
2006-12-19 23:24
2007.01.14
Поучавствуйте в маркетинговом исследовании :)


15-1166797103
vitv
2006-12-22 17:18
2007.01.14
Смысл использования курсоров в БД


2-1166780797
svt
2006-12-22 12:46
2007.01.14
Уважаемые мастера, подскажите можно ли работать через Delphi


9-1142295967
chemicalR
2006-03-14 03:26
2007.01.14
Игра на память.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский