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

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

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

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 23.02.2012, 18:08   #1
EvilChaotic
Мастер
 
Аватар для EvilChaotic
 
Регистрация: 05.04.2008
Сообщений: 910
Написано 530 полезных сообщений
(для 3,006 пользователей)
Black Bird

Посоны, привет!

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

Сейчас немножко времени прибавилось и появилась возможность сделать какую-нибудь небольшую игрушку. Поэтому, не долго думая, я сразу решил разобраться с сетевой частью!

За ночь и сегодняшний день сделал "онлайновые" самолетики. По ходу изучения примеров у меня накопился такой огромный ящик вопросов.. и некому задать.



Самый большой вопрос, который возникал почти во всех местах, связанный се сетью: КАК ПРАВИЛЬНО?

Собственно на данный момент есть клиент и сервер.
Сервер может обслуживать сразу ряд клиентов. Работает реалтаймовое подключение игрока в мир и проработан дисконект. Сами самолеты летают на физике Bullet. Сама физика считается на клиентах! Сервер имеет только ряд функций по модерации игроков (кик, дисконект, репозиция игрока и тп) а также предоставляет подключаемым клиентам данные о других игроках. Нету никаких "угадываний нажатий клавиш", клиент предоставляет серверу свою позицию, а сервер раз в некоторое время отправляет всем клиентам информацию. Все это дело оформлено на UDP. Первое впечатление после работы с сетью: оху**ь.

Собственно не получилось решить самую главную проблему.
Дома стоит роутер на четыре компа. Каждый имеет свой такого плана 192.168.1.2. Поэтому работает только локальная сеть. Как все это дело можно оформить и не в локале? Пните в нужном направлении и сегодня вечером уже можно будет полетать, пострелять!

PS. Squid просто исчез!?
__________________

EvilChaotic About
(Offline)
 
Ответить с цитированием
Эти 11 пользователя(ей) сказали Спасибо EvilChaotic за это полезное сообщение:
Amatsu (24.02.2012), FireOwl (23.02.2012), HolyDel (23.02.2012), Igor (24.02.2012), mauNgerS (04.03.2012), moka (23.02.2012), Program23 (25.02.2012), Randomize (23.02.2012), Reks888 (23.02.2012), Samodelkin (24.02.2012), St_AnGer (26.02.2012)
Старый 23.02.2012, 20:21   #2
h1dd3n
Бывалый
 
Аватар для h1dd3n
 
Регистрация: 19.06.2008
Сообщений: 679
Написано 264 полезных сообщений
(для 450 пользователей)
Ответ: Black Bird

Сообщение от EvilChaotic Посмотреть сообщение
Собственно не получилось решить самую главную проблему.
Дома стоит роутер на четыре компа. Каждый имеет свой такого плана 192.168.1.2. Поэтому работает только локальная сеть. Как все это дело можно оформить и не в локале? Пните в нужном направлении и сегодня вечером уже можно будет полетать, пострелять!
Нужно иметь белый внешний IP, и пробросить на роутере порты (порт). Потом поднять сервер и коннектиться по внешнему ипу.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilChaotic (23.02.2012)
Старый 23.02.2012, 21:03   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Black Bird

Сами самолеты летают на физике Bullet. Сама физика считается на клиентах!
уже неправильно, на клиентах можно считать только не геймплей-специфик части. считаем все на сервере
кстати, сервер ты на чем писал?

пс. скрин, как всегда, зачетный
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
EvilChaotic (23.02.2012), pozitiffcat (24.02.2012), St_AnGer (26.02.2012)
Старый 23.02.2012, 23:25   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Black Bird

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

Сервер должен отвечать за все просчёты влияющие на геймплай и доступность информации. Клиент же должен получать ТОЛЬКО ту информацию которую должен (если чужой корабль ушёл в инвиз, то слать инфу о его позиции НЕЛЬЗЯ, т.к. простой чит сниффа (симулируем пакет от сервера типо "противник 42 вышел из инвиза", и мы снова его видим).
Таких читов может быть куча и повсюду. Например если пытаешься стрелять во врага, и что-то стоит на пути, если проверку будет делать клиент и слать пакет стрельбы серверу, а сервер будет тупо стрелять - то тут wallhack легко реализовать.
В политике сетевых отношений, Клиент - это лох, который всё выполняет, раб, и лишь просит разрешения на то или иное действие, которое не факт что выполнится. А Сервер - это босс, он всё решает, и лишь он всё знает.
Сервер должен быть устойчив на любой спам, и любую ересь от клиентов и ещё других приложений. Должен качественно уметь отсоединять клиентов, и сообщать об этом также качественно. Проблемы большие будут на каждом шагу.

Сеть, это большой лес. Писать сервер на каком-нибудь блице, я настоятельно не рекомендую.

Клиент - это рендер.
Сервер - это мозг.

Насчёт соединений, есть возможности обхода NAT'а, но это не просто, блицом этого не реализуешь. Можно конечно сделать сервер отдельно, который будет обходить NAT, и паралельно с сервером запускать игровой клиент (как в HL, там на деле запускается dedicated сервер, как процесс, и скрывается консоль), тот кто хостит игру, на деле запускает сервер, и такой же клиент как и все другие игроки, и сам к себе коннектится.
Пока нету возможности обойти программно NAT, можешь забиндить сервер на прослушку любого IP (хз как в блице), далее запускать сервер на определённом порту, выбери какойнибудь 20ххх, далее, идёшь в настройки роутера, и там устанавливаешь port forwarding на свой комп, указывая порт сервера.
Для теста попробуй сам к себе зайти, но у клиента устанавливай внешний IP. Узнать его тут.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilChaotic (23.02.2012)
Старый 23.02.2012, 23:56   #5
EvilChaotic
Мастер
 
Аватар для EvilChaotic
 
Регистрация: 05.04.2008
Сообщений: 910
Написано 530 полезных сообщений
(для 3,006 пользователей)
Ответ: Black Bird

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

EvilChaotic About
(Offline)
 
Ответить с цитированием
Старый 24.02.2012, 09:14   #6
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,853 пользователей)
Ответ: Black Bird

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

Или как сказал МоКа Port Forwarding:
Нечто похожее на это:


Проверить открытость порта из вне можно тут:
http://www.canyouseeme.org/

Ещё бывает, что проблема не в твоём роутере, а у провайдера. Тогда при создании сервера надо чётко указывать ip на котором происходит слушание пакетов. Это можно делать например в RakNet (для Blitz3D есть? А на Blitz3D ли ты пишешь?)
Ещё посмотри у своего провайдера услугу "внешний ip". С такой штукой можно хостить что хочешь без запар вообще.

Сообщение от EvilChaotic Посмотреть сообщение
PS. Squid просто исчез!?
2-3 недели назад был

И да, рад тебя видеть!
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilChaotic (25.02.2012)
Старый 24.02.2012, 09:30   #7
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Black Bird

Читал статью какого-то мощного чувака, что все просчеты выполнять только на сервере. Сервер посылает каждому клиенту его данные, тогда будет синхронно, причем что бы исключить рывки при передвижении, нужно передавать не координаты объекта, а кнопки которые он нажал, а они уже обрабатываются клиентом! Короче это жесточайший гемор, я как то баловался танчики писал, что - то получалось, но я так и не осилил работу без глюков. При плохой связи, например получается, что кнопка как-бы заедает... При хорошей связи все окей. Мой совет будешь писать, держи клиент на удаленном сервере VPS, подключай 3G модем и тестируй, добивайся работы без лагов. Тот кто говорит, что на 3G нельзя добиться хорошей работы онлайн - это бред. Я играл в WOW с пингом 400.
(Offline)
 
Ответить с цитированием
Старый 24.02.2012, 15:09   #8
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Black Bird

Сообщение от pozitiffcat Посмотреть сообщение
Читал статью какого-то мощного чувака, что все просчеты выполнять только на сервере. Сервер посылает каждому клиенту его данные, тогда будет синхронно, причем что бы исключить рывки при передвижении, нужно передавать не координаты объекта, а кнопки которые он нажал, а они уже обрабатываются клиентом! Короче это жесточайший гемор, я как то баловался танчики писал, что - то получалось, но я так и не осилил работу без глюков. При плохой связи, например получается, что кнопка как-бы заедает... При хорошей связи все окей. Мой совет будешь писать, держи клиент на удаленном сервере VPS, подключай 3G модем и тестируй, добивайся работы без лагов. Тот кто говорит, что на 3G нельзя добиться хорошей работы онлайн - это бред. Я играл в WOW с пингом 400.
Ты видимо очень не внимательно читал, т.к. всё напутал.
Клиент шлёт изменение состояния клавишь, всё примитивно просто: игрок зажал вверх, игрок отпустил вверх, и т.п.
Сервер далее считает всё исходя из инпута, далее выдаёт игрокам уже координаты объектов. Выдача данных должна быть в виде снимков мира, в весьма постоянной переодичности.
Синхронности это никакой не даёт - клиент будет отставать сам от себя в ДВА пинга.
А действие других игроков в адрес тебя, будет на сервере обрабатываться с разностью в ТРИ пинга..
Поэтому есть разные методы синхронизации, сам термин называется dead reckoning.
Есть два метода - интерполяция, и экстраполяция. Первый подрузумевает плавное применение данных от прошлого до последнего данного в наличии. Как поняли тут будет задержка - отставание от сервера в ДВА С ПОЛОВИНОЙ пинга.
Поэтому есть экстраполяция. Это попытка предсказывания следующих данных на основе прошлых. Зная направление движения объекта и скорость - не сложно вычислить его будущую позицию. Но это не просто, нужно использовать сплайны.
Дальность предсказывания должна равняться ровно одному пингу между принимающим данные и сервером.
Даже собственные данные, применяются не сразу, а только как достигнут сервер на самом деле, но ещё не пришли на клиент - получается, что сам свои данные будешь силой задерживать во времени в размере своему пингу.
Таким образом все клиенты будут пытаться симулировать мир максимум приблизительно как на сервере в данный реальный момент.
Также отсылая например данные о выстреле на сервер, если это моментальный выстрел (не летящий снаряд), то сервер принимая данные, должен вычислять в прошлом, назад в размере на один пинг от посылающего, т.к. когда он посылал пакет с выстрелом, то основывался на состоянии мира в тот момент на клиенте, но сервер получит пакет позже на один пинг, поэтому он вежливо берёт данные из прошлого, и делает вычисления там.
На сервере нужно реализовывать машину времени, длиной в максимум секунду (имхо), с наличием всех времени зависимых данных на каждый тик за последнюю секунду. Например если у нас UPS (update per second) == 30, то сервер должен хранить времени зависимые данные со всех этих 30 тиков.
Такие данные как положение персонажа - времени зависимые. Или например жив или мёртв - тоже времени зависимое, т.к. игрок Х может умереть от выстрела игрока А у которого пинг 30, а игрок Б тоже убил у себя игрока Х, но пинг у него 200. Убили они его в реальном времени почти в один момент, но игрок Б чуток раньше (на 50 мс например). Но сервер получит сперва пакет от игрока А, и обрабатывает его в прошлом на 30 мс. Далее через ещё 120 мс после обработки, прийдёт пакет от игрока Б, который если вернуться на 200мс назад, убил игрока Х, который чуть позже также был убит игроком А, но ведь игрок Б раньше это сделал, а из-за пинга мы получили данные позже. Но ведь игрок Б - сделал это раньше.
Вот такой пример-парадокс. И таких парадоксов будет уйма, постоянно! Работать с сетью - это большой геморой, и приступать к кодингу сервера, без долгого штурма пачек бумаги и брэйнстормов с друзьями - тупо нельзя, иначе потратите время, потом переписывать будете.

Да и чтобы создать лаги - не нужно 3G, это очень просто симулировать, реализовав очередь при отсылке и приёме от сервера, внеся туда немного хаоса.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
pozitiffcat (24.02.2012), Samodelkin (24.02.2012), tormoz (25.02.2012)
Старый 24.02.2012, 15:50   #9
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Black Bird

Интересно а есть ли готовые движки для C++ на основе ГеймОбъектов как в BlitzMax?
(Offline)
 
Ответить с цитированием
Старый 24.02.2012, 16:13   #10
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,853 пользователей)
Ответ: Black Bird

Сообщение от pozitiffcat Посмотреть сообщение
Интересно а есть ли готовые движки для C++ на основе ГеймОбъектов как в BlitzMax?
Это ты к чему и что за ГеймОбъекты?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 24.02.2012, 17:32   #11
Amatsu
Дэвелопер
 
Аватар для Amatsu
 
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений
(для 2,706 пользователей)
Ответ: Black Bird


А в какой конторе работаешь, если не секрет?


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

з.ы.

Уж не над Star Conflict случаем работаешь? Уж больно тамошний дизайн на твой похож
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Amatsu за это полезное сообщение:
EvilChaotic (25.02.2012), Program23 (25.02.2012), Wegox (07.04.2012)
Старый 24.02.2012, 17:32   #12
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Black Bird

В BlitzMax реализовано в виде объектов. Какая то хитрая система синхронизации, я уже не помню, баловался года 2 назад, но мне понравилось.
Имею ввиду сетевые движки для c++
(Offline)
 
Ответить с цитированием
Старый 24.02.2012, 17:51   #13
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,853 пользователей)
Ответ: Black Bird

Сообщение от pozitiffcat Посмотреть сообщение
В BlitzMax реализовано в виде объектов. Какая то хитрая система синхронизации, я уже не помню, баловался года 2 назад, но мне понравилось.
Имею ввиду сетевые движки для c++
BlitzMax/mod/brl.mod/blitz.mod
Все исходники там

Сообщение от Amatsu Посмотреть сообщение
он не жрет 100% системы как блитц
Цикл без задержек должен жрать 100% системы. ( while(True){} напиши в плюсах ) Если в цикле вызывать пускай даже незначительный Delay то управление быстрее перейдёт к остальным процессам в ОС и "жрать" программа на блице будет как положено.

На счёт пурика не согласен. Я считаю, что пурик дырявая неюзабельная кулебяка. Ничего стоящего на нём ещё не видел. Его внутренняя организация - чистой воды хулиганство. Для сервера рекомендую C#, Java ну или BlitzMax (благо он имеет весь нужный функционал) Если тупо потренироваться то можно и Blitz3D.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
Amatsu (24.02.2012), Dzirt (24.02.2012), moka (24.02.2012), pozitiffcat (25.02.2012), Reks888 (24.02.2012)
Старый 24.02.2012, 18:50   #14
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Black Bird

Насчёт пурика - поддерживаю.
Рекомендую C#, ну или Java. Но по мне так с C# проще работать, и он в некоторых моментах конкретно лучше, а в некоторых (имхо менее значительных, хуже). Плюс msdn документация очень удобная.

Кстати, EVE сервер на пурике расписанный
(Offline)
 
Ответить с цитированием
Старый 24.02.2012, 20:21   #15
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Black Bird

серверу евы приписывают самые разные языки, от пурика до эрланга )
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (24.02.2012)
Ответ


Опции темы

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

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


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


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