Игровой тик и 50 миллисекунд на весь мир
Minecraft меряет время не кадрами, а тиками: один тик — 1/20 секунды. Всё, что движется в мире, получает право обновиться ровно один раз за тик.
Игра не держит в памяти весь мир. Она держит несколько тысяч столбов по 16×16 блоков — и всё, что происходит с вами, происходит внутри них.
Чанк — это 16 блоков в ширину, 16 в длину и 384 по высоте: с версии 1.18 мир тянется от −64 до 320. Итого 98 304 позиции. Карта размером 10 000 × 10 000 блоков — это около 390 000 чанков, и все они в памяти не помещаются. Поэтому игра загружает область вокруг игрока и выгружает остальное.
Внутри чанка данные нарезаны горизонтальными секциями 16×16×16 — по 4 096 блоков. Блоки лежат там не объектами, а индексами в палитре состояний. Пустота и камень дают короткую палитру, и секция весит мало. Когда в секции появляются вода, стекло или блоки из модпака, палитра расширяется, и памяти уходит больше. Отсюда неочевидное: два чанка с одинаковым числом блоков могут занимать разный объём.
Первый фильтр — пирамида видимости: геометрия за спиной на видеокарту не уходит. Второй — расстояние: чанки за границей прорисовки не отсылаются вовсе. Обоих фильтров недостаточно, потому что прозрачные блоки, листва, частицы и крупные модели требуют отдельных проходов рисовки. Одна и та же дальность в 8 чанков даёт разный FPS на равнине, в тайге и в мегабазе со стеклом.
Блоки не рисуются поштучно: секция превращается в меш — набор вершин, граней и материалов. Игрок ломает стену, и игра пересобирает не мир, а затронутую секцию и прилегающие грани. Сложность в том, что свет считается вместе с геометрией: один факел или стекло у воды заставляют перестроить соседние секции. Массовая стройка, проходка туннеля и редстоун-устройства, меняющие блоки каждый тик, дают десятки перестроек в секунду — это и есть провалы кадров на иначе ровной машине.
Java Edition собирает мусор в объектах чанков, сущностей и модов. Малый лимит — сборщик ходит часто, и каждый проход заметен микрофризом. Слишком большой лимит — не лекарство: за один проход нужно обойти больше живых объектов, и пауза удлиняется. Размер подбирают под конкретную сборку, с учётом модпака, дальности прорисовки и числа сущностей, и смотрят не на мегабайты, а на поведение кадра в плотной застройке.