Как поднять сервер для игр
Тут вспомнилось в тему. Как то раз я пробовал поднять свой игровой сервер и заработать немного денег. Чисто ради развлечения.
Это была игра Arma3. Я взял к ней очень интересный мод (Antistasi), и сильно его вправил, модифицировал, заметно улучшил скрипты игровой логики этого мода + всякие интересные настроички на сервере.
Но денег заработать так и не получилось.
Я дорос до 16 игроков по вечерам на своём сервере. Для игрового сервера на Arma3 нормой является 40 человек. Но донат уже можно собирать от 20 человек.
Недогнал я чуть-чуть. Как Steam обьявил новогодние скридки, и народ ливнул с Arma3 вообще на другие игры.
Может пробовал кто что-то подобное?
Или может тут есть держатели игровых серверов? Поделитесь, сколько труда было вложено и какой на выходе доход?
1. На одном сервере много не заработаешь.
2. Нужна команда.
3. RP самые прибыльные.
f1ufx_
> Как Steam обьявил новогодние скридки…
Нe вовремя поднял сервер, выходит.
P.S.: Надо как на бирже: Конкуренция засыпает, тогда и добро энтузиастам…
Было дело поднимали сервер для мморпг ragnarok online, когда оно еще было популярно. прибыли приносил в рублях от 40к до 100к на команду из 3 человек. Онлайн был до 2к в пике, в среднем 1300-1500. давно это было.
Потом правообладатель заметит существование вашего супер популярного сервиса, приносящего сто баксов в месяц и его юристы набегут, будут гонять вас и ваш сервер ссаными тряпками по всему интернету. А если им удастся вас ещё и в суд затащить, тогда вообще плохо будет.
kvakvs
> Потом правообладатель заметил существование вашего супер популярного сервиса,
> приносящего сто баксов в месяц и его юристы набегут, будут гонять вас и ваш
> сервер ссаными тряпками по всему интернету. А если им удастся вас ещё и в суд
> затащить, тогда вообще плохо будет.
Не обязательно, в большинстве случаев почти всю ответственность можно скинуть на пользователей, а с ними никто судиться не будет.
Хотя конечно еще зависит чью игру ты эксплуатируешь для заработка и в какой стране живешь.
Mephistopheles
Спасибо за инфу! Не знал что рагнярёк был так популярен. Я как-то пропустил вообще всю эту эпопею с онлайн играми в те годы. Занимался линуксом )
А тебе случаем Arma3 не интересна? =)
kvakvs
В России вовсе не надо что-либо нарушать чтобы получить дубинкой по почкам.
И кстати, чувак. Твои либеральные взгляды детектед. За тобой уже едут.
f1ufx_
> И кстати, чувак. Твои либеральные взгляды детектед. За тобой уже едут.
за мат извени мем.jpg )))
Жора Монтировка
+1
Я пришёл к такому же выводу.
Жора Монтировка
> зачем тратить ресурсы на сервер? если можно потратить их на создание игрушки
а если игрушка ММО?
> которая будет приносить копеечку, и забот не будет
что за игрушка?
почему не знаю? : )
Когда в следующий раз будете открывать свой пиратский сервер ММО, то вспомните вот такие истории:
http://gameway.com.ua/topgamenews/2155-blizzard-zasudila-vladelca… illionov.html
dxgames
> Когда в следующий раз будете открывать свой пиратский сервер ММО, то вспомните
> вот такие истории:
Так то сша и то близард, нужно как бы понимать у кого и где воруешь:)
f1ufx_
> А тебе случаем Arma3 не интересна? =)
не, спасибо. Своих проблем хватает.
Реализация серверной части в многопользовательских онлайн играх
За свою недолгую жинь я ни разу не встречал программиста, который бы не любил игры. И уж тем более, программиста, который никогда их не писал.
Кто-то начинает с тетриса, кто-то со змейки. У кого-то это увлечение проходит, а кто-то этим «заболевает» и превращает свою болезнь в любимую работу или занятное хобби.
В эру интернета и социальных сетей играть одному неинтересно, хочется общаться и играть вместе с друзьями.
И не просто общаться, а ходить группой в подземелье или показать кто на арене хозяин.
В данной статье я бы хотел рассказать о своем подходе к серверной реализации такого взаимодействия.
Задача
Рассмотрим пример простого игрового приложения, в котором игрок управляет персонажем, который может покупать\продавать предметы, сражаться на арене, ходить в подземелья один или с друзьями.
Концепция
Например, игрок создает группу для похода в подземелье. Игрок посылает запрос нашему серверу, который добавляет новую группу в список доступных групп для походов, после чего остальные игроки имеют возможность получить этот список и присоединиться. Группа заполняется, и, нажатием кнопки, создатель отправляет ее в подземелье на встречу опасным монстрам.
Казалось бы, все просто. Создаем таблицу в БД, записываем туда желающих и отправляем в подземелье.
Так думают многие начинающие программисты, но забывают про самую главную проблему многозадачных систем — race condition.
Логично предположить, что правильной реализацией такого взаимодействия был бы серверный демон, который отвечал за состояние игрового мира, принимал запросы от игроков (в порядке очереди), обрабатывал их и отдавал результат.
В нашем случае сервер должен хранить текущее состояние игроков, чтобы иметь возможность корректно обрабатывать результаты.
Схематично это выглядит так:
Пожалуй, самое интересное — это обработчик запросов.
Он содержит в себе основную логику нашего сервера:
— хранение состояния игроков (свободен, находится в подземелье, в группе и т.д.)
— хранение и обработка информации об игровом мире (битвы на арене, походы в подземелья, группы для похода)
Хранить состояние игрока нам необходимо для того, чтобы, например, пока персонаж занимается геноцидом монстров в подземелье, мы не смогли пойти на арену или прикупить себе новый доспех.
Кроме того, на сервере должна производиться обработка игрового мира.
Допустим, мы пошли в подземелье на 5 минут. За 5 минут сервер должен произвести обработку битвы с монстрами, посчитать опыт, дроп, а также изменить состояние игрока.
Стоит не забывать, что количество игроков может быть очень большим и нашему серверу придется нелегко.
Реализация
Для реализации такого демона был выбран язык PHP 5.3 с расширением libevent, как наиболее знакомый автору.
Про libevent существует много статей, создан небезызвестный phpDaemon, поэтому углубляться в его работу не имеет смысла.
Стоит только отметить возможность создания отложенных событий (флаг EV_TIMEOUT), что в нашем случае решает очень много проблем.
Однако, наш сервер должен, кроме всего прочего, достаточно активно работать с БД для записи результатов, покупки вещей и т.д.
Как известно, БД — узкое место любого серьезного приложения, а наш сервер может «лечь» от большого количества запросов.
Поэтому для обработки «тяжелых» запросов можно предусмотреть дополнительный серверный демон с необходимым нам числом нитей (thread/workers), которые будут с радостью выполнять всю кропотливую работу.
Стоит отметить, что запросы к work daemon так же становятся в очередь и не обрабатываются, пока мы не получим ответ.
Принцип работы work daemon такой же, как и основного демона, за исключением наличия нескольких нитей (thread/workers) для обработки запросов.
Выводы
Достоинства такого подхода заключаются в следующем:
— всю тяжелую работу мы сбрасываем на work daemon, а обработку состояний игроков оставляем на нашем основном демоне, что делает его очень легковесным и быстрым
— work daemon можно вынести на отдельный сервер, в случаем необходимости, а количество workers варьировать в зависимости от железа
— возможность масштабирования
А теперь о недостатках.
Самый главный недостаток реализации: PHP течет. Даже новый сборщик мусора в 5.3 не решает всех проблем. И мы имеем:
Решение: периодически перегружать worker’а, когда объем используемой памяти достигает определенного предела.
Наиболее правильным решением я вижу использование языка программирования Erlang\OTP.
Поставленная задача отлично укладывается в его концепцию FSM/gen_server, чем автор и планирует заняться в ближайшее время.
Надеюсь, что статья поможет начинающим разразботчикам игр не наступать на грабли и правильно проектировать свое приложение.
Домашний сервер для онлайн игр (необходимые комплектующие)
Возьми за эти деньги vds/vps. Счета за электричество покроют дальнейшие расходы, когда закончатся 1200€. Имхо
Судя по гуглу ему нужны 4 быстрых ядра. Так что классический i7-7700K или что-то вроде, бгг.
В другом месте вообще пишут сервер однопоточный))
Имеется ввиду арендовать vds/vps или же купить готовый сервер? Аренда мне обходится сейчас в 21 евро ежемесячно за 30 слотов. Если же арендовать сервер от 100 слотов, то цена увеличивается многократно, 69 евро ежемесячно. 1200 делим на 69 и получаем 17 месяцев аренды. Пример расхода электроэнергии: на дому Intel Xeon X3363 (Single 4-Core 2.83 ГГц), 2×8ГБ, 2×750ГБ Seagate SAS 7200U/min 3.5″, CD-привод, Raid-контроллер, 1x блок питания, 1U: около 140 ватт я беру в среднем 200 ватт и того: в месяц 17 евро расход электроэнергии. лучше 17 евро чем 69.
готов поднять ставку, если дело в производительности сервера и его стабильности для онлайн игр.1200 евро это была моя приблизительная ставка на одиночный домашний сервер. так как не знал с чего отталкивоться.На всякий случай; Сервер только для одной онлайн игры, не хостинг. Ещё раз всем спасибо за ваше внимание и желание помочь нуждающимся в вашей помощи. С уважением, Игорь.
Серьёзный вопрос (без шуток)
А в чём профит содержать подобный сервер? Это в 2017 приносит какую-то прибыль?
Просто, раньше было ясно, зачем держать сервера с контрой и перацким ВОВ-ом. Но потом все, вроде как, переползли на лицензионки на сервера соответствующих корпораций.
Спасибо за дельный совет.Приму во внимание. Я так понимаю, что Intel зарекомендовал себя как стабильный и прогрессирующий продукт, разработанный с учетом будущего.Выбор в общем очевиден. Буду брать Intel.
Для справки райзен не дружит с виндовым планировщиком. Пока что не дружит. Так что однозначно интелы
Ну, лично я никогда не смотрел в сторону AMD. Наверное, еще в начале 2000-х рассказы о том, что перегревается, нестабильный, ядро можно сколоть при установке кулера сделали свое дело.
Agones, создаем многопользовательский игровой сервер. Архитектура и установка
Agones (от др.-греч. agōn — «соревнование») позволяет развернуть кластер игрового сервера используя Kubernetes с возможностью Auto-Scaling. Этот open-source проект был создан в 2018 году, уже набрал 2500 звезд, был на Google I/O 2019, и на Хабре, к великому удивлению, еще не был упомянут. В топике описан краткий экскурс в архитектуру и инструкция по запуску тестового сервера на локальной машине. Если интересно, добро пожаловать под кат, вперед!
Описание проекта
Agones представляет собой Custom Resource (расширение Kubernetes API).
Проект в действительности требует большего внимания, так как позволяет запускать единичный игровой сервер (GameServer) или же целый «флот» серверов (Fleets) посредством конфигурационных yaml файлов, через Agones API. В свою очередь, каждый сервер дает оповещения о его жизненном цикле (GameServer lifecycles), описывая текущий статус (health checking, connection information). Сервера в кластере имеют возможность автоматического масштабирования (Fleet Autoscaling), которые интегрированы с базовыми возможностями Kubernetes. В дополнение, есть вывод статистики на панели (dashboard) с помощью Prometheus, Grafana или Stackdriver, экспортируются метрики посредством OpenCensus, что позволяет добавить собственный экспортер. Пример dashboard’a в Stackdriver:
Архитектура, основные элементы
Сам по себе Agones берет на себя задачу запуска, автоматического расширения и хостинга игровых серверов используя в основе Kubernetes. Это позволяет сосредоточиться на разработке самого сервера многопользовательской игры, вместо разработки ее инфраструктуры и дальнейшей поддержки. Можно использовать любой игровой сервер, который может быть запущен на linux, причем он может быть написан на любом языке программирования.
Agones Kubernetes API делится на три основных пакета (packages), в каждом из которых находятся ресурсы: agones.dev (GameServer, GameServerSet, Fleet), allocation.agones.dev (GameServerAllocation), autoscaling.agones.dev (FleetAutoscaler). Как и в других ресурсах Kubernetes для их запуска используется yaml файлы.
Краткое описание каждого ресурса:
Диаграмма (отсюда) показывает жизненный цикл GameServer ресурса:
Фиолетовыми стрелками отмечена работа Agones SDK, красным — API пользователя, синим — контроллер игрового сервера, желтым — контроллер приложения.
Установка
В данном и последующих разделах используются команды с инструкции на официальном сайте, с некоторыми дополнениями. Рекомендуется использовать Kubernetes версии 1.12 (протестировано разработчиками). Для теста на локальном компьютере можно использовать minikube, который потребует kubectl и гипервизор (Hyper-V или VirtualBox) поддерживаемый операционной системой.
Для установки кластера и Agones необходимо запустить следующие команды:
Последняя команда скачивает конфигурационный файл Agones создающий Custom Resource Definitions (CRD) через Kubernetes API.
Запуск GameServer
Теперь можно запустить в кластере UDP сервер используя готовый тестовый сервер из примеров, который будет просто отвечать на посланный к нему запрос:
Если после запуска команды в консоли появится ответ «ACK: hello», то сервер работает, его можно выключить следующей командой, которая инициализирует :
Вносим изменения в GameServer
Используя предыдущий пример изменим ответ сервера. Для начала скопируем репозиторий проекта:
Эта команда может занять некоторое время, так как весь репозиторий проекта будет копироваться в image. Этого можно избежать, если в директории оставить только папку sdks, файл main.go и Dockerfile.
Далее в examples\simple-udp\gameserver.yaml изменим строку 28 на image: agones-go:modified и создадим новый GameServer:
Проверим изменения и выключим сервер:
Если после запуска команд в консоли появится ответ «ACKNOWLEDGED: hello», то внесенные изменения прошли успешно.
Запускаем сервер локально
Как я хотел просто поднять Minecraft сервер для сына, а получился полноценный игровой сервер
Я никогда раньше не играл в Minecraft. Скажу даже больше, мне он был не особо интересен. Скорее все, по причине того, что я не понимал его идеи. Да, я видел, что в нем можно строить бесконечное множество сооружений, выращивать разного вида растения и животных, строить механизмы. Но я все еще не мог понять, как за этой игрой с примитивной графикой мои дети могут проводить целые дни напролёт.
Но вот в один прекрасный день, восьмилетний сын пожаловался, что у него мало друзей и ему почти не с кем играть в Minecraft. Особенность стандартной бесплатной сетевой игры в Minecraft является то, что друзья могут играть на твоей карте только тогда, когда она запущена у тебя на компьютере или мобильном устройстве. Но если ты выходишь из игры, друзья тоже не могут подключиться. Поэтому всегда приходилось ждать, когда друг освободится, либо играть самому.
Я начал думать, как ему помочь найти больше друзей и решить проблему с игрой по сети. Я знал, что есть альтернативная версия сетевой игры от Minecraft, которая называется Realms. Это платная подписка, по которой ты можешь создавать свой сервер, а Minecraft выступает хостером. Недостаток этого варианта в том, что играть на таком сервере может до 10 человек. Так же нет возможности устанавливать моды — дополнения от сторонних разработчиков, которые изменяют или дополняют оригинальный контент Minecraft. Такие сервера без модов еще называют ванильными.
Таким образом, изучив немного тему, я предложил ребенку поднять сервер с какой нибудь интересной картой и разместить его IP адрес в интернете, что бы на него заходили другие игроки. Таков был план по поиску друзей для совместной игры.
Я знал, что существует две версии Minecraft. Одна — это Pocket Edition, предназначена для мобильных устройств и Windows 10, вторая — Java Edition, для ПК. Как оказалось они не совместимые друг с другом, поэтому я выбрал Java Edition, так как в игровом мире этой версии больше возможностей, в добавок под нее существует более широкий выбор плагинов. Ну и еще потому, что я Java разработчик.
Следующие пару часов я занимался тем, что создавал дроплет на digitalocean.com и разбирался, как запустить сервер Minecraft.
Оказалось, что помимо нативного Vanilla сервера, существуют так же сторонние имплементации API для взаимодействия с игровым миром. Одна из них, Spigot — модификация оригинального сервера, позволяющая помимо прочего запускать плагины сторонних разработчиков, существенно расширяя возможности игрового мира. Такие плагины позволяют создавай мини-игры, вводить ограничения для игроков, объединять сервера в сеть и многое другое. Я остановился именно на этой реализации сервера, так как под него было множество плагинов и огромное комьюнити как разработчиков, так и пользователей.
Совсем скоро я понял, что одной картой не обойдусь.
Таким образом нам нужны были две карты, первая — для так называемого лобби, куда попадают все только что подключившиеся к серверу игроки. Вторая карта — непосредственно для самой мини-игры. Так же мне нужно было найти сам плагин игры и разобраться, как реализовать переход из лобби в игру и назад. Я посмотрел, как это реализовано на популярных серверах и понял, что есть несколько вариантов. Самых распространённых два — переход при нажатии на табличку и при нажатии на игрового персонажа, так называемого npc. Первый способ мне показался более примитивным и менее привлекательным. Вариант с персонажем был более интересным, с возможностью менять внешний вид npc, создавать голографические надписи и т.д.
Следующим этапом был поиск и установка соответствующих плагинов, которые позволяли бы переходить между картами, назначать команды для npc, отключать возможность наносить урон игрокам и многое другое. Сервер начал обрастать функционалом, а меня начал затягивать это процесс. Становилось понятно, что существуют огромные возможности по модификации игрового мира и мне, как Java разработчику, было интересно больше узнать про процесс разработки плагинов, которые также в большинстве своих случаев написаны на Java.
Мы с сыном разделили обязанности, я занимался в основном серверной частью, он доработкой и улучшением карт. Я тоже, ради интереса, начал подключаться к этому процессу и заметил для себя, что строительство песочного пляжа и пещер с водопадами позволяют отлично отдохнуть после трудового дня.
Но прежде чем размещать информацию о сервере в интернете, я решил, что одной мини-игры мало, сервер выглядит пустоватым и занялся поиском и установкой еще одной популярной мини-игры SkyBlock.
В этой игре тебе дается небольшой остров и ты должен на нем выживать, расширяя его и защищаясь от различных монстров. В процессе конфигурации плагина игры пришлось даже связываться с разработчиками, что бы они исправили найденый мною баг, который не позволял создаваться автоматически острову при первом запуске игры.
Настраивая сервер и устанавливая различные плагины, я всегда руководствовался мыслью, что все взаимодействия игрока с миром должны быть максимально упрощены и автоматизированы. Если ты зашел на карту с мини-игрой, она должна по возможности начаться автоматически, игрок не должен ни чего нажимать, не должен вводить ни каких команд.
Давалось мне это с большим трудом, подолгу разбираясь в длинных файлах конфигураций плагинов, а иногда обращаться за помощью к разработчикам и даже покупать плагины с более широким функционалом. Но, не смотря на все трудности, пока мне удалось все настроить так, как мне этого хотелось.
Естественно, я ориентировался на лидеров этой индустрии и старался перенять их подходы в организации взаимодействия игрока с игровым меню. В Minecraft это реализовано специфически в силу особенностей игры. Так, все элементы меню — это блоки или другие игровые предметы и даже персонажи. Все это накладывает определенные ограничения на разработчиков, но и добавляет особенного шарма игре.
В итоге, я довел сервер до более-менее презентабельного состояния и опубликовал IP на одном из популярных сайтов. Он находился на первой странице в списке новых серверов пару часов и за это время его посетили десятки игроков. Многие хорошо отзывались о сервере, но так же было видно, что такого количества посетителей мало, что бы им было интересно оставаться на сервере продолжительное время. Но, не смотря на это, у нас появились первые постоянные игроки, а так же желающие помогать в развитии сервера. Как правило, это были дети и подростки, один из которых предложил создать и настроить Discord — сервис для голосового, видео- и текстового общения. Он очень популярный в игровом сообществе, но совершенно мне не знакомый. Так же у нас появился один постоянный игрок в SkyBlock, который был для нас как бета-тестировщик, терпеливо сообщал о багах, недочетах, которые я старался оперативно исправлять.
Что в итоге? Сейчас на сервере установлены две карты для Murder Mystery, добавлена мини-игры AcidIsland, CaveBlock, SkyGrid — это всё вариации SkyBlock, добавлена очень популярная игра BedWars. Добавлены внутриигровые деньги, магазин для игр из серии SkyBlock, зарегистрирован домен, установлен Discord бот для синхронизации внутриигрового чата с чатом в Discord. В планах расширить разнообразие игр, добавить внутриигровые ранги, запустить сайт. Количество дроплетов растет постоянно. На данный момент их уже шесть, суммарно на 16 CPU и 40 Gb RAM. Да, это занятие не дешевое, но для меня оказалось очень увлекательным. Надеюсь, в будущем, получится монетизировать сервер и вернуть потраченные средства. А пока мы с сыном с удовольствием играем на созданных нами картах, улучшаем и дополняем их. У него появились друзья, а я полюбил Minecraft за его безграничные возможности для игроков любого возраста.
Если вы так же, как и мы, любите Minecraft и вам понравилась наша история, заходите в гости и посмотрите, что и как у нас получилось. Если у вас есть вопросы по технической части, добавляйтесь в Discord.