Una cabeza personalizada almacena una URL envuelta en JSON base64, no una imagen
El componente de perfil contiene base64 de {textures:{SKIN:{url:…}}}. Por eso el aspecto de una cabeza se fija en el momento en que se creó, y por eso la base de datos puede tener decenas de miles de entradas.
Una Cabeza de jugador personalizada no contiene una imagen. Contiene un hash de textura, envuelto en JSON, envuelto en base64, dentro del componente de perfil del objeto.
Las capas
Partiendo de un hash, el comando se construye de la siguiente manera:
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>"}]}]
Cuatro capas para decir "esta cabeza se parece a esa imagen". La propiedad siempre se llama textures, y el valor es siempre el base64 de esa forma JSON.
Dos cosas se derivan directamente:
Una cabeza es una instantánea, no un enlace a una persona. La URL apunta a un archivo de textura inmutable, no a una cuenta. Lo que sea que ese hash resolvió cuando se hizo la cabeza es lo que siempre mostrará.
Los datos son minúsculos. Una entrada de cabeza es un nombre, un hash y algunas etiquetas, sin bytes de imagen en absoluto. Por eso un catálogo puede contener decenas de miles de cabezas como JSON estático simple y aun así cargarse rápidamente.
Por qué el catálogo carga por categoría
La base de datos aquí es la colección de cabezas CC0 de TheSilentPro, y se obtiene una categoría a la vez en lugar de todas a la vez. Un índice enumera las categorías y sus recuentos; al seleccionar una solo se obtiene ese archivo.
Eso no es ingeniería perezosa, es la única forma que funciona con este tamaño. La colección completa como un solo JSON sería una descarga grande para alguien que quisiera tres cabezas de una categoría.
El límite de renderizado de 300 elementos es un límite del DOM, no un límite de búsqueda
Los resultados se muestran como máximo 300 a la vez. La búsqueda sigue ejecutándose en todo lo que hay en la categoría cargada; el límite se aplica a cuántos se convierten en nodos DOM, no a cuántos se consideran.
Esta distinción es importante cuando una búsqueda dice que está mostrando los primeros 300: las entradas que faltan se encontraron y se están reteniendo de la página, no se excluyeron de la consulta. Reducir la búsqueda las pone al alcance en lugar de buscar con más ahínco.
Mostrar decenas de miles de elementos a la vez es lo que el límite existe para evitar, y es un límite real en lugar de un número redondo defensivo: una cuadrícula tan grande deja de ser desplazable mucho antes de dejar de ser renderizable.
Nada aquí sube nada
Los datos de la cabeza son JSON estático del mismo origen. La única solicitud de terceros es la vista previa <img> de mc-heads.net, que resuelve un hash en una imagen para mostrar. El comando /give se ensambla localmente a partir del hash, por lo que el comando funciona independientemente de si esa vista previa se cargó o no.