Пользовательская голова хранит URL, обёрнутый в base64 JSON, а не изображение
Компонент профиля содержит base64 от {textures:{SKIN:{url:…}}}. Вот почему внешний вид головы фиксируется в момент её создания, и почему база данных может содержать десятки тысяч записей.
Пользовательская Голова Игрока не содержит изображения. Она содержит хеш текстуры, обёрнутый в JSON, который, в свою очередь, обёрнут в base64 и находится внутри компонента профиля предмета.
Слои
Начиная с хеша, команда строится следующим образом:
1. hash e3b0c44298fc1c149afbf4c8996fb924…
2. JSON {"textures":{"SKIN":{"url":"http://textures.minecraft.net/texture/<hash>"}}}
3. base64 eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6…
4. component /give @p player_head[profile={properties:[{name:"textures",value:"<base64>"}]}]
Четыре слоя, чтобы сказать: "эта голова выглядит как то изображение". Свойство всегда называется textures, а значение всегда является base64 этой JSON-структуры.
Отсюда следуют две вещи:
Голова — это снимок, а не ссылка на человека. URL указывает на неизменяемый файл текстуры, а не на учётную запись. То, во что этот хеш разрешился при создании головы, будет отображаться всегда.
Данные очень малы. Запись головы — это имя, хеш и несколько тегов — никаких байтов изображения вообще. Вот почему каталог может хранить десятки тысяч голов в виде простого статического JSON и при этом быстро загружаться.
Почему каталог загружается по категориям
База данных здесь — это коллекция голов CC0 от TheSilentPro, и она загружается по одной категории за раз, а не вся сразу. Индекс перечисляет категории и их количество; выбор одной загружает только этот файл.
Это не ленивая инженерия, это единственная форма, которая работает при таком размере. Вся коллекция в виде одного JSON была бы большой загрузкой для того, кто хотел бы три головы из одной категории.
Ограничение рендеринга в 300 элементов — это лимит DOM, а не лимит поиска
Результаты отображаются максимум по 300 за раз. Поиск по-прежнему выполняется по всему содержимому загруженной категории — ограничение применяется к тому, сколько элементов превращаются в узлы DOM, а не к тому, сколько элементов рассматривается.
Это различие важно, когда поиск говорит, что он показывает первые 300: отсутствующие записи были найдены и скрыты со страницы, а не исключены из запроса. Сужение поиска приводит их в диапазон, а не усиливает поиск.
Отображение десятков тысяч элементов одновременно — это то, что предотвращает ограничение, и это реальный лимит, а не защитное круглое число — такая большая сетка перестаёт быть прокручиваемой задолго до того, как перестаёт быть отображаемой.
Здесь ничего не загружается
Данные головы — это статический JSON того же происхождения. Единственный сторонний запрос — это предварительный просмотр <img> с mc-heads.net, который преобразует хеш в изображение для отображения. Команда /give собирается локально из хеша, поэтому команда работает независимо от того, загрузился ли предварительный просмотр.