Из чего складывается производительность Minecraft? Чем и как на неё можно влиять?
Рендеринг (англ. rendering — «визуализация»). Это набор сложных математических вычислений для преобразования программно-описанного объекта, эффекта, явления и т.п. (модели) в статичную или движущуюся картинку, пригодную для визуального восприятия.
FPS ( frame per second — «кадров в секунду»)
Производительность игры обычно измеряется в кадрах в секунду (FPS) или говоря по другому, как часто игра может обновлять экран в течение одной секунды. Существует два типа FPS:
1. Текущий FPS — изменяется для каждого кадра.
2. Средний FPS — усредненный за период времени.
Оба значения видны на экране отладки (F3).
Задержка
Задержка является обратной величиной по отношению к FPS. Она показывает время, прошедшее между двумя обновлениями экрана. Задержку можно рассчитать как 1/FPS и результат получится в секундах. Например, задержка для 50 FPS составляет 1/50 FPS = 0,02 с (20 мс).
Текущие задержки видны на экране отладки в виде зеленого или красного графика (лагометр). Как пример, на скриншоте, приведённом выше, FPS=59 и задержка показывается зелёным цветом с отдельными всплесками других частот.
Каждая вертикальная линия в лагометре — это один кадр. Высота линии — это время, необходимое для показа кадра.
Нижняя цветная часть линии показывает время, затраченное на отрисовку объектов на экране. Это действие включает в себя расчёт моделей объектов, отправку их на графический процессор и рендеринг кадра графическим процессором. В это же время производится и загрузка чанков. Если FPS выше 50, то эта часть линии зеленого цвета, в противном случае она красная.
Белый верх линии показывает время очередного обновления мира (тик). Здесь обновляются блоки и объекты мира. Появление мобов, течение воды, работа redstone, рост деревьев и растений и т. д., всё это происходит в этом отрезке графика. Тик выполняется каждые 50 мс (20 раз в секунду) независимо от частоты обновления экрана. Вот почему при более высоком FPS не каждая линия лага имеет белый верх. Некоторые кадры пропускаются, чтобы поддерживать скорость обновлений по 20 в секунду.
Почему тормозит Майнкрафт?
Можно выделить две основных причины:
- слишком низкий FPS (измеряемая производительность);
- отклик игры на какие-то действия происходит с задержкой или вообще вызывает аварийный отказ (crash), даже при относительно высоком FPS.
Что влияет на измеряемую производительность (FPS)
1.) Для большинства компьютеров при установке дальних расстояний отрисовки главным ограничивающим фактором являются возможности графического процессора (GPU).
Minecraft отображает вдаль около 5 000 мини-чанков (16x16x16), из которых в кадре может быть видно до 1 300. Каждый мини-чанк имеет в среднем около 6 000 видимых вершин блоков.
Это в общей сложности порядка 8 миллионов вершин или около 2 миллионов квадратов на кадр. Даже при работе только с 30 FPS это соответствует обработке примерно 60 миллионов квадратов в секунду.
Я привожу здесь этот очень приблизительный расчет, чтобы наглядно был виден тот объём работы, которую должен выполнять графический процессор.
2.) Возможности центрального процессорного устройства (ЦП) для решения следующих задач:
- обновления мира (тики), во время которых выполняются почти все динамические события игры:
- появление и исчезновение мобов;
- искусственный интеллект (ИИ) мобов — решение, что должны делать мобы, реакция на действия игрока;
- физика — падающий песок, летающие стрелы и т.п.;
- погода;
- рост, выкорчевывание растений;
- обновление динамических текстур — это обновляет текстуры для динамических блоков (вода, лава, портал, часы, компас и огонь) в основной текстуре ландшафта для имитации анимации. Обновление может сильно нагружать процессор для пакетов текстур HD качества.
- подготовка объектов к рендерингу
ЦП должен решить, какие объекты нужно рендерить в каждом кадре, и отправить нужные в графический процессор. Сюда входят различные проверки видимости, определение порядка рендеринга (сортировка) и прочее. Одна часть этой подготовки выполняется на Java, остальная часть — в драйвере графического процессора.
- загрузка мира
Minecraft использует инкрементную загрузку мира, которая начинается с чанков рядом с игроком и заканчивается чанками на расстоянии просмотра.
Когда игрок осматривается вокруг себя, должны загружаться новые чанки, находящиеся на расстоянии просмотра, а те, которые выходят за пределы расстояния просмотра, должны быть выгружены.
Пока игрок перемещается, процессор почти постоянно занят загрузкой и выгрузкой чанков мира. Загрузка чанка выполняется внутри цикла рендеринга и является частью времени рендеринга в лагометре (красные или зеленые линии) и состоит из:- загрузки данных чанков с диска (сервера) или создания данных ландшафта для новых чанков;
- анализа данных чанка для определения видимых граней блока и подготовки данных рендеринга (координат вершин и текстуры);
- отправки данных рендеринга на графический процессор, где они компилируются в фиксированном списке отображения API OpenGL.
3.) Другие запущенные программы
Minecraft использует ресурсы ЦП, графического процессора, ОЗУ и внешнюю память совместно со всеми другими запущенными в данный момент программами и операционной системой. Соответственно, это накладывает ограничения на одновременное использование одних и тех же ресурсов. Если один из ресурсов занят, то очередник должен дождаться, пока ресурс станет доступен, а затем продолжить его использование.
Это особенно важно для одноядерных CPU. На двух- и многоядерных процессорах второе и дополнительные ядра могут выполнять фоновые действия, в то время как Minecraft работает на первом ядре. На одноядерных ЦП фоновые действия, которые используют ЦП, будут вызывать постоянные задержки.
Сильное влияние на производительность Майнкрафта оказывают:
- совместное использование системных файлов;
- антивирусы;
- различные мессенджеры (Skype и проч.).
- излишняя нагрузка на диски:
- дефрагментация;
- индексация файлов;
- предвыборка Windows.
4.) Память
Minecraft имеет схему использования памяти, типичную для Java-программы. Выделенная память медленно заполняется, пока не будет достигнут предел, а затем вызывается сборщик мусора, который освобождает всю неиспользуемую память. Затем цикл повторяется снова.
Наименьшее значение, до которого падает используемая память, — это реальная память, которая нужна программе, остальное — это буфер для сборщика мусора, поэтому для экономии времени работы ЦП его не нужно вызывать очень часто. Но когда памяти достаточно, даже это меньшее число не соответствует реальной загруженности ОЗУ, потому что сборщик мусора работает не слишком эффективно. Он просто последовательно проверяет, какие объекты пока больше не будут использоваться программой. И найдя, удаляет их. Важно отметить, что сборщик мусора обычно не вызывается до момента заполнения всей выделенной памяти, даже если существует огромный объем памяти, ожидающий освобождения. Т.е. сколько не выделяй памяти в установках — бесполезного содержимого хватит на всё её количество.
По умолчанию программа запуска Minecraft устанавливает ограничение памяти в 1 ГБ. Это тот объем памяти, который Minecraft может свободно использовать. Кроме того, самой Java необходима память для своих собственных целей, что увеличивает общий объем до примерно 1,5 ГБ.
Чтобы обеспечить 1,5 ГБ физической памяти для Майнкрафта, нужно иметь на компьютере общий объём ОЗУ не менее 2,5—3 ГБ, отдавая «лишнюю» память под нужды операционной системы и фоновым процессам. Только тогда эти 1,5 ГБ физической памяти становятся реально свободными для использования Minecraft.
Часто свободной физической памяти остается менее 1,5 ГБ. В этом случае Java должна будет частично перейти на виртуальную дисковую память. Этот сильно затормозит работу, поскольку диск намного медленнее (в 1 000 раз), чем физическая память.
На самом деле Minecraft требуется не более 256 МБ для работы, в основном используется около 100—150 МБ. Это для ванильного Minecraft, работающего на 32-битной Java без установленных модов и не использующего дополнительных текстур. Любая память выше этого будет использоваться для буфера сборщика мусора и может переключиться на виртуальную дисковую память и, соответственно, вызвать большую задержку.
Запуск Minecraft с меньшим предустановленным объемом памяти значительно снижает вероятность переключения на виртуальную память, особенно для компьютеров с объемом ОЗУ менее 3 ГБ.
Использование же 64-битной Java, модов и HD-текстур может значительно увеличить использование памяти.
5.) Дизайн
Minecraft имеет минималистичный дизайн с очень небольшим количеством настраиваемых параметров. Большинство переменных, влияющих на производительность, являются фиксированными и хорошо обрабатываются машинами игрового класса с мощными вычислительными и графическими процессорами.
Возможность изменять многие из этих переменных и находить лучший баланс между возможностями и производительностью, в игру добавляет мод OptiFine. Он также добавляет много оптимизаций общего назначения, которые помогают значительно улучшить FPS.
Воздействия на отклик программы
Отклик игры напрямую связан со стабильностью FPS в течение определенного периода времени. Стабилизация FPS означает, что время, необходимое для обновления каждого кадра, должно оставаться неизменным. Это отображается в лагометре в виде линий одинаковой высоты.
Появляющиеся пики задержки, даже если они не влияют на средний FPS, нарушают плавность движения игры и могут сильно раздражать. В большинстве случаев более низкий стабильный FPS предпочтительнее, чем иметь более высокий, но нестабильный FPS. Типичным примером является знаменитый “Lag Spike of Death”, который вызывается функцией автосохранения и генерирует одиночные Они практически не влияют на средний FPS, но будут сильно мешать, поскольку повторяются довольно часто.
Решающим фактором для видимости моментов задержки является их высота и частота, с которой они возникают. Сильные пики у задержек, которые случаются очень редко, или очень легкие всплески их величины, которые случаются часто, обычно не заметны.
- ) Причины нестабильности задержки
Minecraft использует относительно несложные алгоритмы расчётов, которые выполняются внутри циклов рендеринга, и любые новые действия в работе, которые необходимо выполнить, приводят к пульсации FPS или скачкам величины задержки.
- загрузка чанка
Одна из наиболее важных причин нестабильности FPS — это загрузка чанков. При загрузке чанков мира Minecraft обычно загружает их по порядку. Когда чанк пуст (например, только воздух), расчётов производится немного и рендеринг происходит очень быстро. При загрузке сложного чанка (до 15 000 вершин) у ЦП и драйвера графического процессора нагрузка резко возрастает. Затрачивается дополнительное время и в результате «вылезает» неприятный красный пик задержки. - обновления мира (тики)
При обновлении мира много событий происходят случайным образом, например: спаун мобов, рост деревьев, погода и т.д. Если несколько из них находятся внутри одного и того же тика, то им нужно некоторое время, результатом может быть увеличенный белый отрезок задержки. Поскольку эти события случайны, белые выбросы задержки обычно редки и менее заметны. - фоновые процессы
На одноядерных процессорах любой фоновый процесс, которому требуется процессор, может вызвать увеличение задержки.
Также любой фоновый процесс, работающий с диском, может приводить к нарастанию задержки при загрузке чанков мира с диска. - виртуальная память
Бывают моменты, когда Minecraft пытается задействовать больший объём выделенной памяти, но ОЗУ полностью занято фоновыми процессами. В таких случаях система часть памяти располагает на диске, в файле подкачки (pagefile.sys), и это может вызвать значительную пульсацию величины задержки. Эти её колебания также могут плохо повлиять на средний FPS.
- ) Борьба с резкими скачками величины задержки
Работа над статьёй продолжается…
О замеченных ошибках, дополнения и вопросы, пожалуйста, пишите в комментариях.