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

jopi

Попрошайка
1,421
30
260
В общем такая тема, сижу значит ковыряю 1.4.7 и вижу что MinecraftServer не способен тянуть 1000 игроков потому-что просидает TPS и тики идут слишком долго, как вообще это можно исправить? Если мультипоток то где его лучше реализовать и тд, сколько сижу на миникрафте ничерта не в курсе про оптимизацию работы сервера и миров
 

jopi

Попрошайка
1,421
30
260
Понял спасибо, буду пробовать кидать в мультипоток генерацию и сохранение мира
 

GoogleTan

Картошка :3
1,354
43
310
Ну для начала, можно разбить миры на отдельные потоки. Это будет проще(поидее), но если у тебя 5+ модов на измерения то очень поможет.
 
808
3
124
ТСу советую очень хорошо подумать, перед тем как пытаться параллелить сервер кубача: действительно ли нужно, чтобы эта тысяча игроков была в едином игровом мире? Не лучше ли просто поставить что-нибудь вроде BungeeCord и раскидать игроков на несколько серверов под общим адресом, и синхронизировать между этими серверами данные которые нужно синхронизировать?

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

Сохранение мира тем временем давным-давно в отдельном потоке, на 1.4.7 тоже должно быть. Генерация вроде как нет, но если размеры мира ограничены (что в любом случае является хорошей идеей), то ничего не мешает заранее сгенерировать весь мир.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Тут я согласен с тобой, в 90% случаев система разбиения мира на локация=сервер подойдёт.
Но если нужны какие-то ивенты как в ММО, где по 500 человек в одном месте тусуется, то придется задуматься. Ну и без опыта в многопоточности браться за такой большой проект очень грустно... А если игра с форджем и модами - вообще нереально.
 
808
3
124
От 500 человек в одном месте в любом случае сдохнет производительность клиентов и с большой вероятностью сеть (потому что нагрузка в таких случаях квадратичная - нужно передавать позиии 500 игроков 500 игрокам). Тут уже не только сервер переписывать, а вообще всё.
 

tox1cozZ

aka Agravaine
8,454
598
2,890
А почему игра так медленно рендерит чанки? Телепортируешься куда-то и секунд 5-7 ждёшь пока мир вокруг прорисуется. Вроде ограничений в коде не нашел. Как можно ускорить?
 
1,173
28
168
Да, согласен с глумми, можно "распараллелить" сервак на локации (как сделано на том же сталкрафте)
Не копался там в коде, но думаю что можно сделать такую реализацию через зоны AABB (конкретно в игре выделяешь зону), и если игрок вошел в нее, то его бы кидало на подлокацию или на другой сервер
Про банджи корд не читал, как там сделано
 

jopi

Попрошайка
1,421
30
260
ТСу советую очень хорошо подумать, перед тем как пытаться параллелить сервер кубача: действительно ли нужно, чтобы эта тысяча игроков была в едином игровом мире? Не лучше ли просто поставить что-нибудь вроде BungeeCord и раскидать игроков на несколько серверов под общим адресом, и синхронизировать между этими серверами данные которые нужно синхронизировать?

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

Сохранение мира тем временем давным-давно в отдельном потоке, на 1.4.7 тоже должно быть. Генерация вроде как нет, но если размеры мира ограничены (что в любом случае является хорошей идеей), то ничего не мешает заранее сгенерировать весь мир.
Ну не просто так-же вопрос задан, здесь лобби и тд не подойдут, реализация исключительно на чистом майне, генерация нет, сохранение не смотрел, мир не ограничен пока никак но про пре-генерацию в курсе, ну и типо FML там нету и суть вся в том что-бы просто оптимизировать работу майнкрафта и сервера
 
2,505
81
397
А почему игра так медленно рендерит чанки? Телепортируешься куда-то и секунд 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 почти не дал буста.
 
2,505
81
397
Я работал над версией 1.7.10. Но я свободно модифицировал исходники без миксинов и прочих плясок.
 
808
3
124
А если не секрет, что делал с вызовами Block.setBlockBoundsBasedOnState (который меняет стейт самого объекта блока и ни разу не тредсейф)? Переписал все блоки где оно переопределено?
 
Сверху