Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 06.10.2011, 23:01   #1
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
TCP сеть

Всем привет.
Пробую изучить ТСП протоколы в блитсе, чтоб делать сетевые игри. Для элементарного понятия делаю банальный и простой чат.
Командой HostNetGame(UserName$) создал комнату, а с другого компа зашел в нее при помощи StartNetGame()

Первая проблема что пересылаются пустые сообщения, но это не столь важно, главная проблема, что прога жрет весь ресурс проца. И немного подвисает. А когда закрываешь ее то еще некоторое время она не отвечает.
Проц (пентиум 1.8 одноядерный, но думаю не в этом дело)

Вот немного кода. Это выдрано из главного цикла:
Repeat

;Просто принимаем сообщение:----------------------------------
If RecvNetMsg() Then
     Print "Recieving message from "+NetMsgFrom()+": "+NetMsgData$()
End If
;----------------------------------------------------------------


;Просто отправляем сообщение:--------------------------------
If KeyHit(28)
     FlushKeys()
     MSG$=Input(NetPlayerName(Me)+", your message is: ")
     FlushKeys()
     SendNetMsg 1,MSG$,0,0
EndIf
;----------------------------------------------------------------

If KeyHit(1) Exit
Forever
End
Простите что выкидываю код, знаю как это, рыться в чужом коде (одногрупникам часто помогаю) но тут его совсем мало...
(Offline)
 
Ответить с цитированием
Старый 06.10.2011, 23:23   #2
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: TCP сеть

Перед Forever поставь Delay 50 - не будет грузить весь проц.
Я директ плеем не пользовался никогда, но по-моему надо перед принятием сообщения еще проверять и его тип - NetMsgType()

If RecvNetMsg() Then
     If NetMsgType()<100
          Print "Recieving message from "+NetMsgFrom()+": "+NetMsgData$()
     EndIf
EndIf
Вроде так...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (06.10.2011)
Старый 06.10.2011, 23:37   #3
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: TCP сеть

Епти как все просто. Сенкс...

Последний раз редактировалось Hulk-DS, 07.10.2011 в 01:07.
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 01:08   #4
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: TCP сеть

Рас уж я создал эту тему то спрошу еще кое что:
1. Почему SendNetMsg имеет 99 разных типов?
2. Могу ли я в нормальной функциональной игре использовать только 1 тип?
3. И вообще, какая разница между разными типами?
4. Когда в справке блитса есть 2 отдельных категории DirectPlay и TCP. То это 2 совсем разных вида подключения?
5. Если 4 - да. Какой из них проще/лучше?
6. Какая команда мне поможет осуществить поиск рабочих серверов? (тоесть созданных игр, что то вроде кнопки Refresh в контерстрайке)
7. Когда на форуме редактируеш сообщение, то тема апается?

Ну пока что вроде все. Заранее сенк.
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 01:09   #5
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: TCP сеть

Вредный советик:
Если не хочешь мучаться, то используй RakNet (wrapper)

Я пробую делать шутерок (сервер на BMax под Linux и Win, а клиент на B3D под Win) используя RakNet. Связь установлена. Просто теперь нужно обдумывать логику игры.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (07.10.2011)
Старый 07.10.2011, 01:21   #6
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: TCP сеть

Сенкс. Советик кульный. Но я считаю что сначала лучше самому освоить хоть на елементарном уровне логику: TCP, UPD, DirectPlay, а потом юзать библиотеки, потому что я не имею ни малейшего представления как в играх устроена сеть.
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 02:00   #7
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: TCP сеть

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

TCP - лучше, хоть и более низкого уровня абстракции.

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

Другое дело, в сети очень важна логика самого взаимодействия и модели сетевых игр. Например есть peer-to-peer (p2p), когда каждый клиент соединяется с каждыйм другим клиентом. Клиенты считают у себя каждый всю логику, и лишь сверяют на соответствия, и при необходимости синхронизируют.
А есть Server <> Client, когда все клиенты соединяются с сервером, и сервер считает игровую логику, а клиенты только визуализируют.
Далее есть другая абстракция в сетевых приложениях, писсимистичная или оптимистичная консистенция. Что отличает то как ты работаешь с данными и временем. Учитывая такой фактор как пинг, и время задержки, клиенты могут тупо считать свою логику, и интерполировать данные которые приходят к ним. В p2p весьма сложно реализовать "честную" коммуникацию, т.к. в тех же шутерах, пинг в 200, имеет большое значение, и как узнать что тот клиент на самом деле попал, когда у другого он в другом месте. Поэтому тут важно делать очень много логических махинаций. Фиксированный цикл, с временным шагом, просчёты в прошлом и т.п.
Есть оптимистичная консистенция, используется в сервер <> клиент архитектуре. Когда клиенты предсказывают (экстраполируют) данные вперёд на длительность их пинга. Стараясь этим симулировать игровой мир таким же как в реальном времени на сервере. Но отправляя данные на сервер например о выстреле, сервер всёравно должен возвращаться в прошлое на один пинг, и делать все вычисления в прошлом (тот же снимок состояния по времени, как и на клиенте когда он выслал сообщение). Крч это весьма геморно, и требует МНОГО практики и размышлений.
Поэтому сетевых реалтайм игр очень мало от разработчиков любителей. И предупреждаю, что там будет намного больше подводных камней, чем вы можете предположить..
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Colossus (07.10.2011), Hulk-DS (07.10.2011)
Старый 07.10.2011, 02:24   #8
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: TCP сеть

Блин, обрадовал Но большое спасибо за информативный пост.
Как я правильно понимаю TCP и есть: Клиент==>Сервер. Также я понимаю что ДиректПлей можно оставить и заняться чем то поважней. А протокол UPD это р2р? (где то слышал что для игр используется именно UPD). Также я слышал что протокол TCP гарантирует то что пакет обязательно придет от клиента к серверу или на оборот, но жертвует при этом скоростью.
Сможет ли это гарантировать отсутствие этой проблемы:
и как узнать что тот клиент на самом деле попал, когда у другого он в другом месте
И немного запрыгнув на перед скажу, что под впечатлением от майнкрафта хочу сделать игру гибрид многих стилей стратегия\рпг\аркада\екшн, в которой все замесы будут на 80% зависеть от искуственного интеллекта и стратегии игрока(система взять в таргет как в линедж2). Поэтому спрошу, будет ли для такого стиля игры существенным пинг даже в 500-800?(я говорю про TCP и локальную сеть, в которой пинга почти нет никогда, возможно только через хамачи немного пинговать будет)

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

Вопросы в силе:
1. Почему SendNetMsg имеет 99 разных типов?
2. Могу ли я в нормальной функциональной игре использовать только 1 тип?
3. И вообще, какая разница между разными типами?
6. Какая команда мне поможет осуществить поиск рабочих серверов? (тоесть созданных игр, что то вроде кнопки Refresh в контерстрайке)
7. Когда на форуме редактируеш сообщение, то тема апается?
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 02:41   #9
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: TCP сеть

Я так понял что это пользовательские типы - сделаны чисто для удобства, то есть сам определяешь: тип 1 - например передвижение, тип 2 - сообщение чата, тип 3 - выстрел и т.д.

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

Тема апается, ага
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (07.10.2011)
Старый 07.10.2011, 03:38   #10
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: TCP сеть

Сообщение от Halk-DS Посмотреть сообщение
Рас уж я создал эту тему то спрошу еще кое что:
6. Какая команда мне поможет осуществить поиск рабочих серверов? (тоесть созданных игр, что то вроде кнопки Refresh в контерстрайке)
Скорее всего так:
На главном сервере (создателя игры) хранится список онлайн серверов.
Если кто-то создаёт сервер - посылается сообщение об этом новом сервере. Он вписывается в список серверов.

Игрок проверяет этот список запущенных серверов.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (07.10.2011)
Старый 07.10.2011, 12:53   #11
RBK
Знающий
 
Аватар для RBK
 
Регистрация: 06.12.2010
Адрес: Луганск
Сообщений: 252
Написано 112 полезных сообщений
(для 166 пользователей)
Ответ: TCP сеть

Сообщение от Halk-DS Посмотреть сообщение
Как я правильно понимаю TCP и есть: Клиент==>Сервер. Также я понимаю что ДиректПлей можно оставить и заняться чем то поважней. А протокол UPD это р2р? (где то слышал что для игр используется именно UPD). Также я слышал что протокол TCP гарантирует то что пакет обязательно придет от клиента к серверу или на оборот, но жертвует при этом скоростью.
Здесь описаны эти протоколы и есть примеры использования
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (07.10.2011)
Старый 07.10.2011, 13:19   #12
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: TCP сеть

Когда в справке блитса есть 2 отдельных категории DirectPlay и TCP. То это 2 совсем разных вида подключения?
Оба TCP, но в DirectPlay все не много упрощено..
Если 4 - да. Какой из них проще/лучше?
Проще DirectPlay, но при использовании TCP больше разберешься в принципе работы сети в играх.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (07.10.2011)
Старый 07.10.2011, 14:49   #13
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: TCP сеть

Протокол не имеет никакого отношения к модели коммуникации.
Протокол лишь реализует то как данные посылаются, а модель реализуется уже разработчиком. Хочешь посылаешь данные на сервер (c<>s) и он с ними работает и рассылает другим, а хочешь посылай данные другим игрокам (p2p).

TCP - гарантирует доставку в посланной последовательности, и сохранности данных. Это реализуется разными механизмами, которые работают на операционной системе основываясь стандартам IEEE (не помню какому конкретно, википедия подскажет). Они созданы для того чтобы реализовать всю стабильность протокола. Учитывая их более сложное устройство и необходимость заботиться о большем колличестве вещей, они немного проигрывают в скорости протоколу UDP. Но UDP не имеет никакой гарантии, при этом этот протокол "слепой" - он не держит никаких соединений и т.п. Идентификация соединений также весьма затруднительная задача, и реализовать её нужно будет тебе самому.
Когда тот же TCP, устанавливает соединение и поддерживает его на низком уровне.

1. Почему SendNetMsg имеет 99 разных типов?
Тебе уже ответили.
2. Могу ли я в нормальной функциональной игре использовать только 1 тип?
Да, но тебе нужно как-то различать свои данные, будешь ли ты использовать типы предоставленные функционалом который уже есть, либо сам реализуешь обусловив структуру своих пакетов (протокол), дело твоё.
3. И вообще, какая разница между разными типами?
Ты послал пакет с данными о позиции игрока клиенту, пакет не мудрённый, имеет фиксированный размер. Но вот тебе нужно послать чат сообщение, длина пакета зависит от длины сообщения. Плюс, как ты будешь различать, что это позиция, или сообщение? Для этого их как-то например нумеруют - первые 2 байта например, испольщуют для 16 битного числа, которое идентифицирует тип пакета. Можно как угодно идентифицировать - дело твоё.
6. Какая команда мне поможет осуществить поиск рабочих серверов? (тоесть созданных игр, что то вроде кнопки Refresh в контерстрайке)
Это нужно сделать самому. Иметь сервер, который будет иметь возможность собирать данные о созданных играх, и рассылать их по запросам. Когда кто-то создаёт игру, он отсылает данные о своей игре на этот сервер.
7. Когда на форуме редактируеш сообщение, то тема апается?
Нет.

ЗЫ, почитай статьи про сеть в интернете.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hulk-DS (07.10.2011)
Старый 07.10.2011, 18:03   #14
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: TCP сеть

та блин на сокетах пиши, самое чоткое дело, 13-й символ для идентификафии конца сообщения, первый символ - тип сообщения, остальное тело можно передавать в евент, ну там запрогать обработчик как надо. Сам юзаю, работает чотко, правда приходится протокол придумывать, но это не проблема.
(Offline)
 
Ответить с цитированием
Старый 07.10.2011, 18:37   #15
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: TCP сеть

Протокол свой нужно полюбому придумывать, готовых универсальных решений нету. Всё зависит от жанра, метода, протокола и т.п.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Colossus (07.10.2011), Reizel (07.10.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:23.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com