Kepala Kustom Menyimpan URL dalam JSON Base64, Bukan Gambar
Komponen profil menyimpan base64 dari {textures:{SKIN:{url:…}}}. Itulah mengapa tampilan kepala sudah tetap sejak dibuat, dan mengapa database bisa berisi puluhan ribu entri.
Kepala Pemain kustom tidak berisi gambar. Ia berisi hash tekstur, yang dibungkus dalam JSON, lalu dibungkus lagi dalam base64, dan berada di dalam komponen profil item.
Lapisan-lapisan
Dimulai dari sebuah hash, perintah dibangun seperti ini:
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>"}]}]
Empat lapisan untuk mengatakan "kepala ini terlihat seperti gambar itu". Properti ini selalu bernama textures, dan nilainya selalu base64 dari bentuk JSON tersebut.
Dua hal yang langsung mengikuti:
Kepala adalah sebuah snapshot, bukan tautan ke seseorang. URL menunjuk ke file tekstur yang tidak dapat diubah, bukan ke akun. Apa pun yang diresolusi oleh hash tersebut saat kepala dibuat, itulah yang akan selalu ditampilkannya.
Datanya sangat kecil. Sebuah entri kepala adalah nama, hash, dan beberapa tag — sama sekali tidak ada byte gambar. Itulah mengapa sebuah katalog dapat menampung puluhan ribu kepala sebagai JSON statis biasa dan tetap memuat dengan cepat.
Mengapa katalog dimuat berdasarkan kategori
Database di sini adalah koleksi kepala CC0 TheSilentPro, dan diambil satu kategori pada satu waktu daripada sekaligus. Sebuah indeks mencantumkan kategori dan jumlahnya; memilih satu hanya mengambil file tersebut.
Itu bukan rekayasa malas, itu adalah satu-satunya bentuk yang berfungsi pada ukuran ini. Seluruh koleksi sebagai satu JSON tunggal akan menjadi unduhan besar bagi seseorang yang hanya menginginkan tiga kepala dari satu kategori.
Batas render 300 item adalah batas DOM, bukan batas pencarian
Hasil ditampilkan paling banyak 300 sekaligus. Pencarian masih berjalan di seluruh item dalam kategori yang dimuat — batas berlaku untuk berapa banyak yang diubah menjadi node DOM, bukan berapa banyak yang dipertimbangkan.
Perbedaan ini penting ketika pencarian mengatakan sedang menampilkan 300 pertama: entri yang hilang ditemukan dan ditahan dari halaman, bukan dikecualikan dari kueri. Mempersempit pencarian membawa mereka ke dalam jangkauan daripada mencari lebih keras.
Menggambar puluhan ribu elemen sekaligus adalah apa yang ingin dicegah oleh batas ini, dan itu adalah batas nyata daripada angka bulat defensif — kisi sebesar itu berhenti dapat digulir jauh sebelum berhenti dapat dirender.
Tidak ada yang diunggah di sini
Data kepala adalah JSON statis asal yang sama (same-origin static JSON). Satu-satunya permintaan pihak ketiga adalah pratinjau <img> dari mc-heads.net, yang mengonversi hash menjadi gambar untuk ditampilkan. Perintah /give dirakit secara lokal dari hash, sehingga perintah berfungsi terlepas dari apakah pratinjau tersebut dimuat atau tidak.