Оптимизация миникруфта

bonenaut7

Попрошайка
1,426
31
261
В общем такая тема, сижу значит ковыряю 1.4.7 и вижу что MinecraftServer не способен тянуть 1000 игроков потому-что просидает TPS и тики идут слишком долго, как вообще это можно исправить? Если мультипоток то где его лучше реализовать и тд, сколько сижу на миникрафте ничерта не в курсе про оптимизацию работы сервера и миров
 
Понял спасибо, буду пробовать кидать в мультипоток генерацию и сохранение мира
 
Ну для начала, можно разбить миры на отдельные потоки. Это будет проще(поидее), но если у тебя 5+ модов на измерения то очень поможет.
 
ТСу советую очень хорошо подумать, перед тем как пытаться параллелить сервер кубача: действительно ли нужно, чтобы эта тысяча игроков была в едином игровом мире? Не лучше ли просто поставить что-нибудь вроде BungeeCord и раскидать игроков на несколько серверов под общим адресом, и синхронизировать между этими серверами данные которые нужно синхронизировать?

Это на порядки проще, а чтобы распараллелить сервер нужно переписать примерно с нуля все серверное ядро и все моды. Из известных мне крупных проектов этого не делал никто, а проект автора той статьи на хабре много лет как мертв (возможно, потому что инвестировать столько времени в переписывание ядра кубача было бессмысленно?)

Сохранение мира тем временем давным-давно в отдельном потоке, на 1.4.7 тоже должно быть. Генерация вроде как нет, но если размеры мира ограничены (что в любом случае является хорошей идеей), то ничего не мешает заранее сгенерировать весь мир.
 
Тут я согласен с тобой, в 90% случаев система разбиения мира на локация=сервер подойдёт.
Но если нужны какие-то ивенты как в ММО, где по 500 человек в одном месте тусуется, то придется задуматься. Ну и без опыта в многопоточности браться за такой большой проект очень грустно... А если игра с форджем и модами - вообще нереально.
 
От 500 человек в одном месте в любом случае сдохнет производительность клиентов и с большой вероятностью сеть (потому что нагрузка в таких случаях квадратичная - нужно передавать позиии 500 игроков 500 игрокам). Тут уже не только сервер переписывать, а вообще всё.
 
А почему игра так медленно рендерит чанки? Телепортируешься куда-то и секунд 5-7 ждёшь пока мир вокруг прорисуется. Вроде ограничений в коде не нашел. Как можно ускорить?
 
Да, согласен с глумми, можно "распараллелить" сервак на локации (как сделано на том же сталкрафте)
Не копался там в коде, но думаю что можно сделать такую реализацию через зоны AABB (конкретно в игре выделяешь зону), и если игрок вошел в нее, то его бы кидало на подлокацию или на другой сервер
Про банджи корд не читал, как там сделано
 
ТСу советую очень хорошо подумать, перед тем как пытаться параллелить сервер кубача: действительно ли нужно, чтобы эта тысяча игроков была в едином игровом мире? Не лучше ли просто поставить что-нибудь вроде BungeeCord и раскидать игроков на несколько серверов под общим адресом, и синхронизировать между этими серверами данные которые нужно синхронизировать?

Это на порядки проще, а чтобы распараллелить сервер нужно переписать примерно с нуля все серверное ядро и все моды. Из известных мне крупных проектов этого не делал никто, а проект автора той статьи на хабре много лет как мертв (возможно, потому что инвестировать столько времени в переписывание ядра кубача было бессмысленно?)

Сохранение мира тем временем давным-давно в отдельном потоке, на 1.4.7 тоже должно быть. Генерация вроде как нет, но если размеры мира ограничены (что в любом случае является хорошей идеей), то ничего не мешает заранее сгенерировать весь мир.
Ну не просто так-же вопрос задан, здесь лобби и тд не подойдут, реализация исключительно на чистом майне, генерация нет, сохранение не смотрел, мир не ограничен пока никак но про пре-генерацию в курсе, ну и типо FML там нету и суть вся в том что-бы просто оптимизировать работу майнкрафта и сервера
 
А почему игра так медленно рендерит чанки? Телепортируешься куда-то и секунд 5-7 ждёшь пока мир вокруг прорисуется. Вроде ограничений в коде не нашел. Как можно ускорить?
Тут два ботлнека.
1. Передача чанков с сервера на клиент.
2. Генерация рендер-чанков на клиенте.

Рендер-чанк это часть реального чанка размером 16*16*16. При каждом изменении блока необходимо обновить 9 рендер-чанков вокруг. Если не ошибаюсь, то в ваниле эти чанки добавлются в очередь и каждый кадр обновляется n-ое количество чаков. Естественно, это можно и нужно распараллелить. Я делал загрузку в 4 шага. В первом шаге (асинхронном) собирал рендер чанк в буфер тесселятора. Во втором шаге (синхронном), зная размер собранных вершин, аллоцировал VBO. В третьем шаге (асинхронном) копировал память из буфера тесселятора в VBO. В четвертом шаге (синхронном) всякие завершающие действия (например, unmap VBO). Асинхронные шаги выполняются в воркер тредах, которые работают, пока во входной очереди есть таски. Синхронные - в главном треде. Естественно, можно задать сколько угодно тредов, но на каждый тред должен быть свой тесселятор. Еще очень решающей оптимизацией было увеличение самого рендер чанка. В ваниле рендер чанк такой маленький, потому что загрузка происходит синхронно. Я же сделал динамический размер. Самое оптимальное было 32*64*32. При таком размере и загрузка быстрая и occlusion culling приемлемо работал. А еще это ооочень сильно бустит fps. Мир с дальностью прорисовки в 20 чанков в 4 потока рендерился в пределах секунды.

Еще, если интересно, я делал greedy meshing, переопределив тесселятор. Загрузка чанков дольше (и это не страшно, ведь она асинхронная), но быстрее рендеринг за счет уменьшения количества квадов в рендер чанке. Но на самом деле все ломают статические тени, из-за которых плохо склеиваются квады. Если в чистом поле еще хоть как-то работало, то в лесу почти ничего не склеивалось. А еще для ренденринга таких greedy чанков обязательно нужен шейдер и особый формат вершин. В итоге, greedy meshing почти не дал буста.
 
Я работал над версией 1.7.10. Но я свободно модифицировал исходники без миксинов и прочих плясок.
 
А если не секрет, что делал с вызовами Block.setBlockBoundsBasedOnState (который меняет стейт самого объекта блока и ни разу не тредсейф)? Переписал все блоки где оно переопределено?
 
Назад
Сверху