Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2009, 16:36   #1
IceMage
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 15
По умолчанию Сетевая игра

Здравствуйте, профессионалы программирования и не очень )

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

В общем, механизм таков:
Есть приложение-сервер, к нему присоединяются приложения-клиенты.
Для того, чтобы "умельцы" не подкорректировали свои параметры даже в run-time, вся реализация игрового процесса будет происходить на сервере.

Реализация клиент-сервер: сервер слушает фиксированный сокет, при подключении клиента создает для него свои тред (thread) и сокет.

Чисто условно допустим, что весь игровой процесс сводится к бою между командами игроков.
Возникает вопрос, а как это реализовать? Т.е. если у меня на сервере ведутся несколько таких боев, надо создавать для каждого отдельный тред? И как организовать взаимодействие тредов?

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

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

// Естественно, пишу на Delphi, т.к. это хобби, мне в кайф писать на дельфи, никакие аргументы в пользу плюсов не принимаются!

/// Поставим вопрос так: Нужно ли мне вообще с потоками заморачиваться или без них можно обойтись? Если да, намекните, как, т.к. не сам не вижу )

Последний раз редактировалось IceMage; 08.11.2009 в 17:40. Причина: Дополнение
IceMage вне форума Ответить с цитированием
Старый 08.11.2009, 17:08   #2
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

Цитата:
надо использовать базу, но какую?
я думаю, SQL подойдет.
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 08.11.2009, 17:12   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
надо использовать базу, но какую?
зы: mySQL
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.11.2009, 17:12   #4
AlDelta
Реанимируюсь...
Участник клуба
 
Аватар для AlDelta
 
Регистрация: 19.07.2007
Сообщений: 1,445
По умолчанию

IceMage, если на все свои вопросы не ответите или не найдете ответа самостоятельно - забудьте об этой затее
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте.
Правила форума => Правила раздела => Для общего развития => Помощь студентам => Перед тем, как создавать тему, скачайте себе...
P.S.: форум не песочница (с)
название статьи на сайте MS: "Отмена принудительного отключения автоматического запуска в реестре Windows"
AlDelta вне форума Ответить с цитированием
Старый 08.11.2009, 17:18   #5
IceMage
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 15
По умолчанию

Цитата:
Сообщение от AlDelta Посмотреть сообщение
IceMage, если на все свои вопросы не ответите или не найдете ответа самостоятельно - забудьте об этой затее
Безусловно. Целью затеи является, скажем так, повышение квалификации. Постепенно перевожу свои паскалевые знания на объектные, например, использование файловых потоков вместо переменных :D
Ну и еще мне очень интересно именно сетевое взаимодействие и многопоточность, так что сетевая игра - идеальный вариат )
IceMage вне форума Ответить с цитированием
Старый 08.11.2009, 17:29   #6
IceMage
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 15
По умолчанию

Цитата:
Сообщение от AlDelta Посмотреть сообщение
...не найдете ответа самостоятельно...
Я все время наступаю на одни и те же грабли: мои собственные алгоритмы или реализации какой-либо функции часто неоправданно сложны, я их кучу раз улучшаю и в результате оказывается, что пришел к чему-то давно известному ( Вот и спрашиваю чуток теории, чтоб кругами не ходить...
IceMage вне форума Ответить с цитированием
Старый 08.11.2009, 18:37   #7
Alex2009
Proger Man
Форумчанин
 
Аватар для Alex2009
 
Регистрация: 07.03.2009
Сообщений: 584
По умолчанию

Создание онлайн игры?Звучит заманчиво! IceMage проверь ЛС
ShowMessage('Добро пожаловать!');
Alex2009 вне форума Ответить с цитированием
Старый 08.11.2009, 18:56   #8
IceMage
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 15
По умолчанию

А что заманчивого? Там столько всего делать надо, надолго меня займет )

Цитата:
Сообщение от Alex2009 Посмотреть сообщение
проверь ЛС
В папке Входящие - 0 сообщений ))
IceMage вне форума Ответить с цитированием
Старый 08.11.2009, 23:51   #9
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Часть I

Доступ к ресурсам. Если мы создаем какую-либо процедуру, и пишем в ней открытие и обработку файла, используя внутренний VAR переменных, что будет в итоге? ...не ошибаюсь ли я, предположив, что процедура создаст для себя экземпляр файловой переменной и будет с ней работать, не зависимо от того, сколько еще раз сработает эта процедура и сколько понадобится времени на обработку?
К тому же, в науке существуют такие "экспертные системы", в которых обязательно присутствует так называемая "доска объявлений". Обращения к одним и тем же ресурсам, например к файлам, всегда идет через доску объявлений. Что это такое? ...это список, в котором в очереди стоят все обращения до момента своей очереди. Туда попадают только те, обработчики, которые требуют один и тот же ресурс, все прочие выполняются "параллельно".
Сервер всегда хранит информацию как говорится "наготове", обращение к данным лучше всего проводить в ОЗУ, а не посредством файлового хранения. Теперь вопрос: ...зачем нам БД (база данных), если данные лежат в ОЗУ и там обрабатываются? ...ответ такой: чтобы не заморачиваться на создание собственной системы сохранения данных в файлах. С одной стороны просто, с другой - дыра в системе, если все как следует не настроить.
Сохранение данных выполняется только в установленное время, например в начале боя, в конце, при изменении важных параметров, ...и то, это все дело выбора. Если сервер запущен круглосуточно, то ему нужен только бакуп, и именованные файлы данных к каждому пользователю, что, собственно и является уже простейшей БД, а способ загрузки и обработки - СУБД (система управления базами данных), чем и является например SQL.

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

Теперь про сеть. Применяйте TCP/IP, как говорится, "only". Почему? ...у нас будут контролируемые соединения, в прямом смысле этого слова. Сервер ВСЕГДА будет знать какой пользователь пытается повредить сервер ложным пакетом, и оперативно "выпинывать" его из игры, с последующей блокировкой входа. К тому же, сокет создается на конкретного пользователя, с которым предстоит работать, а не так как в UDP, закидали сервер пакетами, поди разбери кто это и что это, и ведь не заткнешь.

...
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.11.2009, 23:52   #10
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Часть II

Относительно самой игры. Что есть отдельный бой? ...это некоторая локация? ...допустим да. Вот несколько игроков вошли в бой, стало быть они в некоторой локации у сервера числятся. Как определить? ...на то в классе юнита есть переменная отвечающая за локацию. Сервер "просматривает" каждую локацию в игре, обрабатывая запросы клиентов, выполняя их преобразования, если запросы посчитались подлинными. Данные обработки отправляются клиентам обратно, опять же по данным переменной локации, поэтому бой будут "видеть", только те клиенты, что участвуют в битве.
Помимо запросов клиентов в игре наверняка есть боты (игроки, которыми управляет компьютер), так вот, ...эти юниты должны жить своей жизнью по своим алгоритмам, управляемым таймерами, а лучше одним игровым таймером. Любое присутствие реальных пользователей в локации, запускает алгоритмы управления ботами, как только локация свободна от пользователей, алгоритмы выключаются, дабы не расходовать ресурсы сервера.

Структура обработки локаций - последовательная. Т.е. как не крути, а локации на сервере числятся списком. Это та же самая доска объявлений, в ней присутствуют только те локации, на которых есть реальные пользователи.

Общая структура работы сервера - "доска в доске..." ...почему так? ...ответ: сложнее "положить" сервер, ...каждый процесс знает свое место, его динамические структуры работают только на него. Если какой-то процесс по списку не выполнится, то он не повредит остальным, будучи просто автоматически пропущенным, или исключенным из списка. Динамическое выполнение запросов пользователей, и обработка данных по требованию - метод не надежный. Представьте себе, что сервер будут "дергать" туда-сюда пользователи, "просящие" то там то тут выполнить их ход. Тут вам нужен UDP.
Вместо этого, достаточно ввести небольшой таймаут, и проверять списки, в которых все объекты оставляют свои запросы, причем за короткий промежуток времени запрос может измениться, а сервер не тратя ресурсов просто выполнит последний. Ошибка? ...нет! ...никто и ничто не может изменять свое состояние в игре без "одобрения" сервера. Т.е. пришел запрос клиента "бью сюда", сервер поставит его в очередь, ...каким-то специфическим образом пришел еще один запрос "я уже бью вот сюда", ну и пожалуйста, ты будешь бить куда последний раз пожелал, опять же, если туда можно бить. Это необходимы уровень защиты сервера. Факт другой, что сервер просто не даст дополнительно изменять часто свои запросы клиентам, просто блокируя канал, ...а если каки-то образом пакеты будут все же идти, то решение сервер примет однозначное - "выпнуть пользователя", аргумент - "счет таймаута не закончен".

Еще масса тонкостей, которые следует учесть при создании сетевых игр и MMO в том числе, ...но к этому вы придете самостоятельно, учась на своих собственных ошибках.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сетевая-программа rocky7 Работа с сетью в Delphi 2 08.09.2009 08:24
сетевая карта Betty Компьютерное железо 6 05.08.2009 23:31
сетевая игра cheef Работа с сетью в Delphi 10 14.07.2009 21:21
Сетевая карта mflat Компьютерное железо 7 23.06.2009 12:42
Сетевая прога Dunkas Работа с сетью в Delphi 2 28.05.2007 09:11