カスタムヘッドは画像ではなく、base64 JSONでラップされたURLを保存する
プロファイルコンポーネントには{textures:{SKIN:{url:…}}}のbase64が格納されています。そのため、ヘッドの見た目は作成時に固定され、データベースには何万ものエントリが存在し得ます。
カスタムプレイヤーの頭は画像を含んでいません。アイテムのプロファイルコンポーネント内に、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>"}]}]
「このヘッドはあの画像のように見える」と言うために4つのレイヤーがあります。プロパティは常にtexturesと名付けられ、値は常にそのJSON形式のbase64です。
そこから直接2つのことが導き出されます。
ヘッドはスナップショットであり、人物へのリンクではありません。 URLはアカウントではなく、不変のテクスチャファイルを指しています。ヘッドが作成されたときにそのハッシュが解決したものが、常に表示されます。
データはごくわずかです。 ヘッドのエントリは、名前、ハッシュ、いくつかのタグであり、画像バイトは一切含まれていません。そのため、カタログは何万ものヘッドを単なる静的なJSONとして保持し、それでも素早く読み込むことができます。
カタログがカテゴリごとに読み込まれる理由
ここでのデータベースはTheSilentProのCC0ヘッドコレクションであり、一度にすべてではなく、一度に1つのカテゴリずつフェッチされます。インデックスにはカテゴリとその数がリストされており、1つを選択するとそのファイルのみがフェッチされます。
これは手抜きなエンジニアリングではなく、このサイズで機能する唯一の形式です。コレクション全体を単一のJSONとしてダウンロードすると、1つのカテゴリから3つのヘッドを欲しがっている人にとっては大きなダウンロードになってしまいます。
300アイテムのレンダリング上限はDOMの制限であり、検索の制限ではない
結果は一度に最大300個まで描画されます。検索は読み込まれたカテゴリ内のすべてに対して実行されます。上限は、いくつのアイテムがDOMノードに変換されるかに適用され、いくつのアイテムが考慮されるかには適用されません。
この区別は、検索が最初の300件を表示していると表示される場合に重要です。不足しているエントリは発見されており、ページから保留されているのであって、クエリから除外されているわけではありません。検索を絞り込むことで、より厳密に検索するのではなく、それらが範囲内に入ってきます。
何万もの要素を一度に描画することを防ぐために上限が存在し、それは防御的な丸い数字ではなく、実際の制限です。そのように大きなグリッドは、レンダリングできなくなるずっと前にスクロールできなくなります。
ここでは何もアップロードされない
ヘッドデータは同一オリジンの静的JSONです。唯一のサードパーティリクエストは、mc-heads.netからの<img>プレビューであり、ハッシュを表示用の画像に解決します。/giveコマンドはハッシュからローカルで組み立てられるため、そのプレビューが読み込まれたかどうかにかかわらずコマンドは機能します。