1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Помощь", создана пользователем Абсик, 21 июл 2020.

  1. Автор темы
    Абсик

    Абсик Активный участник Пользователь

    Баллы:
    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гб/с)
     
    Последнее редактирование: 3 янв 2021
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    А всего то надо было обновиться до 1.15+, там уже давно многопоток. С тебя ядер побольше и все.
     
  3. Sigvegutt

    Sigvegutt Активный участник Пользователь

    Баллы:
    96
    Да, вроде, нормально. Игроки не потерпят несколько секунд что ли?
     
  4. Автор темы
    Абсик

    Абсик Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Abcik
    Я тесты на 1.16 проводил. 4 ядра 4 потока у процессора.
     
  5. Автор темы
    Абсик

    Абсик Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Abcik
    Очень смешно, учитывая что происходить это будет примерно раз в минуту :lol:
     
  6. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Не думаю, что без манипуляций с самим ядром возможно добиться незаметной загрузки мира с диска. Для каких нужд требуется загружать мир снова и снова?
     
  7. Автор темы
    Абсик

    Абсик Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Abcik
    Для каких нужд - особо то и не важно.
    Хочешь сказать, если немного подшаманить над ядром - можно добиться асинхронной загрузки мира?
     
  8. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Честно - неуверен, ибо в исходники практически не лез. Определенно можно разбить загрузку на подзадачи, возможно отправлять некоторые в асинхрон и по окончанию обратно.
    Нужно смотреть в сторону методов CraftServer.createWorld и MinecraftServer.loadSpawn

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

    Абсик Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Abcik
    Удивительно! не изменяя параметр "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 это видимо исправили? И что это вообще было?
     
    Последнее редактирование: 22 июл 2020
  10. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Честно говоря, не испытывал подобное на Paper, хотя тпс падал на 1.15.2 и ниже из-за плохого железа. Потому, не знаю. Может проблема в том, как именно имитировалась нагрузка?
    В таком случае, как уже упомянул, придется лезть в ядро. По идеи, ничего сверхсложного, если просто разбивать загрузку мира на задачи и выполнять её через промежутки времени, а не пытаться сделать её полностью асинхронной.
     

Поделиться этой страницей