Решено Загрузка мира без пролага (Async world loading)

Абсик

Активный участник
Пользователь
Баллы
76
Ник в Minecraft
Abcik
Всем привет!
Возникла необходимость в асинхронной загрузке мира без пролага.
Как мне удалось выяснить - пока это невозможно, так как загрузка миров происходит в главном потоке.
Поэтому, было принято решение не убрать её полностью, а максимально снизить, чтобы она стала незаметной.

Первое, о чем я подумал - нужно предварительно прогружать мир, а потом просто загружать его. Окей - делаем копию мира каждый раз!

Второе, о чем я подумал - раз загрузка происходит в основном потоке - необходим процессор, у которого большая производительность на ядро. Окей - покупаем i9 10900k, или 9900ks. ~5.3 ghz.

Третье, о чем я подумал - процессор то это хорошо, но передаваться то данные будут в память, поэтому нужна быстрая память! Ну допустим у нас есть - ddr4 4400mhz в двухканале.

Четвёртое и последнее - память это хорошо, но файлы то лежат на жестком диске, поэтому берем SSD m.2 3гб запись, 3200мб чтение.

Теперь, знатоки, внимание вопрос:
Учитывая все перечисленные манипуляции смогу ли я добиться незаметного отставания при загрузке мира, или может это всё вовсе не имеет смысла и отставание будет в любом случае?
Если я не правильно понимаю процесс загрузки мира - просьба объяснить доступным языком, спасибо.


Кому интересно - были проведены тесты на следующей конфигурации ПК:
i3 9100f
2x8gb 2400mhz
HDD wd blue (7200)
И вот результаты:
Создание мира в среднем длилось 2205 мс.
Загрузка мира в среднем длилась 700 мс.


Допустимая задержка (для 20 tps) - 50мс.

Я добился задержки всего в 10мс-18мс ( при загрузке уже заранее созданого мира), на PaperSpigot 1.16.1 (С отключенной настройкой "keep-spawn-loaded"), на следующей конфигурации ПК:

i5 9600kf (Overclocked to 4.7GHZ)
DDR4 2x8gb 3200mhz
NVME SSD Sillicon Power 512gb (Запись - 3гб/с, Чтение - 3.2гб/с)
 
Последнее редактирование:
А всего то надо было обновиться до 1.15+, там уже давно многопоток. С тебя ядер побольше и все.
 
Учитывая все перечисленные манипуляции смогу ли я добиться незаметного отставания при загрузке мира, или может это всё вовсе не имеет смысла и отставание будет в любом случае?
Если я не правильно понимаю процесс загрузки мира - просьба объяснить доступным языком, спасибо.
Не думаю, что без манипуляций с самим ядром возможно добиться незаметной загрузки мира с диска. Для каких нужд требуется загружать мир снова и снова?
 
Не думаю, что без манипуляций с самим ядром возможно добиться незаметной загрузки мира с диска. Для каких нужд требуется загружать мир снова и снова?
Для каких нужд - особо то и не важно.
Хочешь сказать, если немного подшаманить над ядром - можно добиться асинхронной загрузки мира?
 
Для каких нужд - особо то и не важно.
Хочешь сказать, если немного подшаманить над ядром - можно добиться асинхронной загрузки мира?
Честно - неуверен, ибо в исходники практически не лез. Определенно можно разбить загрузку на подзадачи, возможно отправлять некоторые в асинхрон и по окончанию обратно.
Нужно смотреть в сторону методов CraftServer.createWorld и MinecraftServer.loadSpawn

А вообще, одна из основных проблем создания/загрузки нового мира - первичная прогрузка чанков, в том числе их генерация. В Paper есть функция, которая отключает прогрузку этих самых чанков - keep-spawn-loaded. Прежде чем ковырять исходники, стоит проверить скорость загрузки мира с этой опцией.
 
Честно - неуверен, ибо в исходники практически не лез. Определенно можно разбить загрузку на подзадачи, возможно отправлять некоторые в асинхрон и по окончанию обратно.
Нужно смотреть в сторону методов CraftServer.createWorld и MinecraftServer.loadSpawn

А вообще, одна из основных проблем создания/загрузки нового мира - первичная прогрузка чанков, в том числе их генерация. В Paper есть функция, которая отключает прогрузку этих самых чанков - keep-spawn-loaded. Прежде чем ковырять исходники, стоит проверить скорость загрузки мира с этой опцией.
Удивительно! не изменяя параметр "keep-spawn-loaded", при чистом paper spigot 1.16.1 загрузка мира занимает от 100 до 300мс.
А вот создание мира длится даже больше, чем на обычном спиготе - 2700мс.
Затем я изменил этот параметр "keep-spawn-loaded".
Загрузка - 40мс-107мс.
Создание - 2700, как и было.
Тем не менее, это уже прогресс. Практически незаметна задержка. Но, к сожалению, иногда она бывает больше 100 мс и это не особо хорошо.

PS. Раньше не воспринимал папер серъёзно, потом, решил провести тест производительности на версии 1.15.2 spigot vs paper (Было не так давно).
В общем, сымитировал нагрузку ~ 11-14 tps. На спиготе было всё +- нормально, но на папере меня тупо откидывало обратно, как какой-то плохой античит. В общем, после этого теста я окончательно разуверился в бумаге. Скажи пожалуйста, в 1.16 это видимо исправили? И что это вообще было?
 
Последнее редактирование:
PS. Раньше не воспринимал папер серъёзно, потом, решил провести тест производительности на версии 1.15.2 spigot vs paper (Было не так давно).
В общем, сымитировал нагрузку ~ 11-14 tps. На спиготе было всё +- нормально, но на папере меня тупо откидывало обратно, как какой-то плохой античит. В общем, после этого теста я окончательно разуверился в бумаге. Скажи пожалуйста, в 1.16 это видимо исправили? И что это вообще было?
Честно говоря, не испытывал подобное на Paper, хотя тпс падал на 1.15.2 и ниже из-за плохого железа. Потому, не знаю. Может проблема в том, как именно имитировалась нагрузка?
Загрузка - 40мс-107мс.
Создание - 2700, как и было.
Тем не менее, это уже прогресс. Практически незаметна задержка. Но, к сожалению, иногда она бывает больше 100 мс и это не особо хорошо
В таком случае, как уже упомянул, придется лезть в ядро. По идеи, ничего сверхсложного, если просто разбивать загрузку мира на задачи и выполнять её через промежутки времени, а не пытаться сделать её полностью асинхронной.
 
Назад
Верх Низ