Логин: Пароль:
Регистрация
Закрытая тема
Показано с 1 по 1 из 1
  1. #1
    Подающий надежды
    Ваш статус
    Неактивен на проекте
    Сообщений
    289
    Регистрация
    18.02.2012
    Репутация
    10  

    Поблагодарил(а) 259
    Получено благодарностей: 1,740 (сообщений: 455).

    Как работает сервер майнкрафта, или - откуда такие лааааги?



    Многие из наших игроков никогда не задумывались о том, как же работает сервер, на котором они играют? Зато они любят жаловаться на лаги, возмущаться запретом каких то предметов, и предлагать поставить на сервера "какой нибудь мод" и увеличить количество слотов на сервере.
    В этой статье я вкратце опишу вам, как работают наши сервера и откуда берутся ЛААААГИ!
    А так же почему администрация не ставит на сервера кучу очень полезных модов и плагинов

    Это Java - язык программирования,
    на котором написан майнкрафт...
    Просто Майнкрафт!

    Начнём, пожалуй, с самого чистого («ванильного») сервера Minecraft, а точнее с того, чем же он вообще занимается. Данные вещи обрабатывает сервер:
    • Чанки — для тех, кто не знает, весь мир Minecraft разделён на куски площадью 16х16 кубов и высотой в зависимости от настроек. Все чанки в радиусе видимости игроков загружены в память сервера и находятся в HashMap-е, каждый «тик» сервера каждый чанк обрабатывается. В это время выполняется следующее: все активные чанки (те, которые находятся в определенном радиусе от игроков) перебираются по очереди. Для каждого чанка выполняется обработка погоды (насыпать снег, ударить молнией), а так же случайная обработка блоков — из всего чанка выбирается несколько десятков случайных блоков, проверяется, нужно ли эти блоки обновлять (по типу блока) и вызывается специальная функция на выбранном блоке.
    • Тайлы — это специальные блоки, которые обрабатываются каждый тик, а не случайно. К данным блокам относятся печи (обновление статуса пережигания материала, оставшегося топлива, это должно делаться равномерно, а не случайно, как тик остальных блоков), так же там находятся спавнеры мобов (блоки, которые спавнят мобов вокруг себя), котлы для зельеварения и подобные вещи. Они все хранятся в списке (List), который заполняется при загрузке чанка или при установке нового тайла во время работы, и перебираются каждый цикл по очереди.
    • Срочные блоки — они, конечно, так не называются, но тем не менее, это блоки, которые нужно обработать «срочно», то есть на следующем цикле или с небольшой задержкой (тоже в циклах, тут все считается в циклах, даже время, даже аллах), а не случайно, т.к. случайные блоки обрабатываются раз в несколько минут в среднем. Обрабатываются примерно как тайлы, только у них может быть указана задержка, через сколько циклов их нужно обработать. Задачи на обработку обычно генерируются во время работы сервера из-за действий игрока или других блоков. В частности, так обрабатывается редстоун, который должен очень быстро реагировать на внешние изменения, блоки огня, текущая вода и подобные.
    • Обновление света — Minecraft использует статическое освещение, разделенное на блоки. Каждый блок имеет свой уровень освещённости от 15 до 0. При изменении блоков их освещённость должна быть пересчитана, алгоритм не очень сложный, но рекурсивный, а так же есть два типа освещения — от блоков (факелов, огня и тп) и от неба, они должны рассчитываться независимо, то есть два раза на каждое изменение (если в мире есть небо, в Nether его нет).
    • Entity — это практически все объекты. Мобы, игроки, предметики, валяющиеся на полу, тележки, лодки, картины, молния, стрелы и прочее. Все они хранятся в одном большом списке и по очереди на них вызывается функция tick(), перед этим проверяется, не умерли ли они, если умерли, то они удаляются из списка и из памяти сервера, соответственно.
    • Спавн мобов — тоже отдельное действие. Мобы спавнятся в определенном радиусе от игрока, при этом выбирается случайная точка в чанке и на основе нескольких сдвигов в разные стороны выбирается, можно ли поставить туда моба, и он создаётся
    • Обработка игроков — все пакеты, которые прислали игроки необходимо обработать, очевидно. Каждое движение, взмах рукой, восстановление здоровья, поворот головы - все это обрабатывается сервером.
    • Загрузка и генерация чанков — если происходит попытка доступа к блоку чанка, которого нет в памяти, чанк должен быть загружен с диска, если его нет на диске, он должен быть сгенерирован. Не надо объяснять, что жесткий диск почти всегда очень узкое место. Генерация чанка ещё сложнее, чем его загрузка.
    • Сохранение чанка — во время общего сохранения сервера или просто, когда чанк долго не использовался и может быть выгружен, чанки необходимо сохранить на диск — преобразовать в поток и записать в файл.
    Казалось бы, все нормально и тут нет ничего преступного, все сделано довольно хорошо и добавить нечего. Проблема тут такая: всё это обрабатывается в одном основном потоке. В последних версиях в Mojang почитали немного про многопоточные штуки и научились сохранять чанки на диск в отдельном потоке. Безусловно это прорыв, потому что это было чертовски узкое место, давным-давно сервер сохранялся по 15 минут и на это время полностью вис, теперь такого нет. Тем не менее, проблема не решена.

    Вы спросите, в чем же тут проблема? Так многие делают: основная логика приложения в одном потоке, это очень удобно программировать, не нужно заботиться о синхронизации и прочих проблемах параллельных приложений. Проблема тут в том, что если на сервере больше 40 человек, вместо стандартных 20 циклов он делает уже 15, если 70 человек, то 10, если 100 — то проседает до невероятных значений. Это при том, что у меня вообще-то мощный 6-ядерный Core i7 и 64Gb оперативной памяти! И куда мне теперь деть эти ресурсы, если из 12 потоков заняты от силы два?

    Не буду пустословить, приведу пример:
    На сервере 223 игрока, при этом радиус видимости выбран достаточно маленький, в памяти находится 46577 чанков, 524 «срочных» блока, 87 блоков редстоуна и поршней, 11240 Entity предметов, 4274 Entity животных, 19 тележек и лодок, 717 других Entity, игроки, которые тоже являются Entity и требуют соответствующей обработки.
    Количество тайлов и обновлений света мой сервер не выводит в информации (мне это не нужно), но можете поверить, их много.

    Одна лишь обработка животных ужасно тяжелый процесс — они регулярно выполняют поиск пути, поиск других Entity вокруг, у них есть AI (в последних версиях довольно продвинутый), поэтому обработать 4 тысячи животных — уже большая работа.

    Обойти 3 миллиона блоков (примерно столько обрабатывается случайных блоков при таком количестве чанков) — тоже не тривиальная задача.

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

    И всё это нужно успеть сделать за 50 миллисекунд, то есть 20 раз в секунду, иначе все начнет тормозить, ведь скорость рассчитывается в циклах. Если сервер делает меньше циклов в секунду, чем должен, то, например, мобы начинают ходить медленно и рывками. Плюс расчётов в циклах очевиден — если сервер подвиснет или произойдёт огромная сборка мусора (сервер ведь на Java), то не получится так, что тележка, едущая на полной скорости на следующем цикле превратится в быстро движущийся маленький объект, и придётся рассчитывать её движение по более сложным алгоритмам.

    CraftBook - один из первых плагинов для Баккита, добавляет лифты,
    ворота, мосты, станции для вагонеток и ускорители.


    При этом есть ещё и Bukkit!


    Bukkit — это такая «надстройка» для ванильного сервера. Он добавляет API для создания плагинов, он супер-удобен для разработчиков плагинов и сделан действительно качественно. Но, грубо говоря, всё становится только хуже. Если игрок присылает пакет, что он немного сдвинулся или повернул голову… создаётся событие и посылается по всем плагинам, которые его обрабатывают. А при этом функция обработки движения и так довольно сложная. При ломании блока или установке происходит то же самое, а так же при около сотни других действий, которые создаёт игрок или сам сервер, включая махание рукой, смену состояния редстоуна, перетекание воды, спавн моба, AI, тысячи их… То есть, как бы система хорошая, но создаёт кучу дополнительных вызовов при обработке всего. На серверах MinecraftOnly используется несколько десятков плагинов, каждый из которых добавляет нагрузки. Да-да.. в чистом майнкрафте нет приватов, нет магазинов, нет разноцветного чата, нет випов и премиумов и их команд, нет лифтов и гейтов, нет экономики и эконов, нет защиты сундуков... наконец, даже русского языка нет! Все эти приятные мелочи требуют свою долю процессорной мощности и оперативной памяти на каждого игрока.
    На основе CraftBukkit отдельные группы разработчиков создают свои платформы, в которые так же вносят улучшения и исправления на свой вкус. Например, популярная платформа Spigot - отличатеся от Баккита распределением памяти и еще много чем. Не все плагины совместимы со Spigot.

    Indusrial Craft 2 - всем известный популярный мод, добавляет в мир электричество,
    новые устройства, инструменты, блоки, предметы и многое другое.


    А после всего этого, есть еще и МОДЫ!


    Все, о чем говорилось выше - касалось чистого майна и майна с плагинами. На нашем проекте это сервера Classic, SandBox и TeraWars. Плагины много чего добавляют, но они оперируют только тем, что уже есть в майнкрафте. А что делать, если хочется.. например... новую руду? Титановую, например? Тут на сцену и выходят моды, которые добавляют в майн еще кучу всяких ресурсов, событий, взаимосвязей, рецептов крафта, существ, измерений.. и так далее и тому подобное. Примеры глобального мода - ThaumCraft, DivineRPG (стоят на 4 серверах нашего проекта)или IndustrialCraft (установлен на 7 серверах). Моды должны уметь взаимодействовать друг с другом, с плагинами и собственно с ядром майнкрафта.

    Сложность задачи покажу так. Предположим, мы решили сделать мод, который позволяет скрафтить урановый лом из урановой руды. Для этого нужно ввести в игру новый объект с уникальным внутриигровым id, определенной прочностью, картинкой, рецептом крафта, с прописанным способом взаимодействия с миром - как он бьет по мобам, по игрокам, по блокам, чаруется ли он и как, ремонтируется ли, стакуется или нет, и по сколько, и многое многое другое. Далее, вспомним про рецепт и про руду. Руда, кроме текстуры, прочности и прочих параметров, должна еще правильно генерироватся в мире на разных высотах. Пережигаться в печи или сразу дропаться, как редстоун. Предположим, мы все сделали. Можно радоваться? А вот и нет, так как плагины взаимодействуют с предметами "чистого" майна и будут игнорировать наш урановый лом. Как это будет проявлятся - предсказать не берусь. Может оказаться, что им можно будет разрушать блоки на приватной территории, или бить игроков в безопасной зоне.
    Взаимодействие с другими модами еще проблематичнее - начиная от банального совпадения id разных предметов из разных модов, и заканчивая вопросом - что получится из уранового лома в утилизаторе? Может, он окажется не уничтожим, а может положит сервер ошибками обработки. И все эти сложности возрастают многократно, если мы захотим сделать не бессмысленный лом, а ввести его в игровой процесс того же ИндастриалКрафта, как часть механизмов.

    Forge
    Для серверов с модами существует особая платформа, называемая ForgeModLoader, которая позволяет добавить в майнкрафт урановый лом. В нем стандартизированы многие функции, и прописаны определенные правила разработки модов, соблюдение которых облегчает совместную работу модов. Ведется например единая база id предметов, что бы в разных модах под одним id не оказывались агуитовая броня и атомная бомба. Однако Forge работал только на "ванильном" чистом майнкрафте без плагинов!

    Совмещение модов и плагинов раньше было очень нетривиальной задачей, их нужно было дописывать и портировать на CraftBukkit, пока не появился проект MCPC+, который включает в себя CraftBukkit совмещенный с Forge.
    Благодаря этому теперь установка модов и плагинов на сервера стала куда проще. Но все то, о чем я рассказывал выше, все это нагромождение программных платформ друг на друга, хоть и повышает удобство, но не лучшим образом сказывается на производительности.
    Скажу лишь, что "чистый" сервер майнкрафта сейчас весит 6 мегабайт. Сервер же mcpc+ с несколькими модами и пачкой стандартных плагинов весит 30 мегабайт в упакованном виде.
    Но это уже совсем другая история...

    (в статье использовано много материала с habrahabr.ru)

    Ну а это - команда Mojang, которые в общем то и делают "главный" Майнкрафт :)




    Последний раз редактировалось mkrtes; 07.10.2013 в 22:10.

  2. 52 пользователей сказали cпасибо mkrtes за это полезное сообщение:

    adik05 (25.08.2020),AgcKuuKoTuk (14.01.2015),AidiStat (21.10.2013),artemkopatel (08.10.2013),BABNIK (05.10.2013),CaptainPenza (13.09.2016),daniilcaVlaSoV (15.11.2015),datexoskeletron (10.05.2015),den4454 (03.09.2014),DIN345 (22.03.2017),dondimon (18.02.2014),DrKiller (18.07.2016),Earthriseii (29.07.2015),EleonS (03.06.2020),Evgenko (07.10.2013),ferno33 (22.07.2016),frank3nstein (17.06.2014),frogerman333 (11.03.2014),GAZ (07.10.2013),Hitriy (06.10.2013),kamikadze063 (16.05.2016),kriperball (09.01.2014),Kroste (08.10.2013),LangerDovers (18.04.2017),looden (30.08.2015),maksimsmamsam (05.03.2014),Margyzinchik (01.01.2014),Mashaclass0 (05.09.2015),messiI (04.04.2016),Milten (08.10.2013),misharem (27.06.2015),mmpppapa3452 (20.07.2014),Morpheusos (24.12.2018),MyXa115 (18.01.2015),nekras (29.05.2024),oNEXTo (02.07.2015),piroman93 (16.04.2014),puvhvh007 (15.09.2014),q_NIKO_p (09.10.2013),Radimir (06.10.2013),Ramstor (29.09.2014),Raze99 (14.11.2014),SIM4ka (03.02.2016),SkiLL001 (27.07.2017),stasik55883 (03.01.2014),strahila002 (24.07.2019),Timur86 (09.07.2018),VxVladVx (29.08.2015),Wolfalure22 (03.06.2015),wqd (11.06.2016),xromec222 (17.12.2016),ylya1999ylya (09.10.2014)

 


Закрытая тема

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
© MinecraftOnly