3D Model Formatları · glTF / GLB · Web İçin Kullanım
Dosya Boyutu Analizi: glTF Paketinde Byte Bütçesi ve Envanter
«Draco açtık, GLB hâlâ 40 MB» çoğu zaman sıkıştırma başarısızlığı değil; yanlış envanterdir: doku payı ayrı sayılmamıştır. GLB vs glTF konteyneri kilitlendi; bu sayfa Web İçin Kullanım hattının üçüncü sorusuna geçer: paketteki byte'lar hangi kalemlere gider ve bütçe nasıl ölçülür?
Holodepth'te dosya boyutu analizi «tek MB rakamı» değildir. Bu sayfa transfer envanteri katmanıdır: geometri, doku, animasyon, JSON metadata ve sıkıştırma katmanlarının ayrı ayrı toplanması; CDN'de indirilen toplam ile kritik yol byte'ının ayrılması; Draco/BasisU'nun hangi dilimi düşürdüğünün görünür kılınması. Decode süresi, GPU belleği ve frame time Runtime Performansı'nda kalır; burada «ne kadar veri indirdik?» sorusu yanıtlanır.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «glTF paket boyutu kalemlere ayrılarak okunur: mesh binary, texture binary, animasyon accessor'ları, JSON chunk ve padding. Transfer boyutu (gzip/KTX2/Draco sonrası) ile decode sonrası bellek aynı değildir. Üç satırlık rapor (geometri / doku / animasyon) teşhisin temelidir; toplam MB yalnızca özet satırıdır. Sıkıştırma uzantılarının mekanizması Uzantılar grubunda; bu sayfa ölçüm ve bütçe disiplinini kilitler.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa glTF dağıtım paketinin byte envanteri ve bütçe metodolojisini anlatır:
- Transfer vs depolama vs decode bellek ayrımı (kavramsal)
- Kalem tablosu: mesh, doku, animasyon, JSON, padding
- Geometri boyut düşüncesi (köşe, index, morph, skin payı)
- Doku boyutu: çözünürlük, slot sayısı, format seçimi (dağıtım)
- Animasyonun sıkıştırılmayan maliyeti
- HTTP gzip/brotli + uzantı sıkıştırması katmanları
- Ölçüm araçları ve CI envanteri (üst seviye)
- Holodepth teşhis ve bütçe açıları
Bilinçli olarak dışarıda bırakılan konular:
- Konteyner seçimi (GLB / modüler) → GLB vs glTF
- «Neden glTF?» stratejisi → Neden glTF
- Draco bitstream / decode API → Draco Mesh Compression
- KTX2 transcoder / GPU format → KHR_texture_basisu
- bufferView byte offset hesabı → BufferView Sistemi
- Parse ms, decode ms, draw call → Runtime Performansı
- GLTFLoader bellek profili → glTF Pipeline (Three.js)
Kısa ayrım: Dosya Boyutu (Ölçüm) «kaç byte indirdik?» · Runtime Performans (Zaman) «o byte'ları işlemek ne kadar sürdü?» · Draco/BasisU (Uzantı) «sıkıştırma nasıl kodlanır?»
Web İçin Kullanım hattı üçüncü soru
| Katman | Odak | Soru | Sayfa |
|---|---|---|---|
| 1 · Strateji | Format seçimi | Web'de neden glTF ailesi? | Neden glTF |
| 2 · Konteyner | GLB / .gltf | Tek dosya mı modüler paket mi? | GLB vs glTF |
| 3 · Boyut | Byte bütçesi | Ne kadar veri indiriliyor? | Dosya Boyutu Analizi (bu sayfa) |
| 4 · Performans | Runtime maliyeti | Parse ve GPU yolu ne kadar? | Runtime Performansı |
Üç farklı «boyut»: transfer, disk, decode bellek
Zihin modeli: sıkıştırılmış kargo, açılmış parça, montaj alanı
- Transfer boyutu = CDN'den inen byte (gzip, Draco, KTX2 dahil).
- Disk / repo boyutu = build artefaktı; modüler pakette çok dosya toplamı.
- Decode bellek = GPU/CPU'da açılmış geometri + decode edilmiş doku (Runtime Performans).
Yeni ekipler «40 MB GLB» dediğinde çoğu zaman yalnızca transfer boyutunu kasteder. Holodepth envanterinde bu rakam tek başına yeterli değildir. Draco'lu geometri transferde küçük görünür; decode sonrası float POSITION dizisi yine tam boyuttadır. KTX2 transferde verimlidir; GPU'da seçilen mip seviyesi bellek tüketimini belirler. Bu sayfa birinci metriği (transfer) derinleştirir; üçüncü metrik için Runtime Performansı'na köprü kurar.
| Metrik | Ne ölçer? | Tipik araç | Bu sayfa |
|---|---|---|---|
| Transfer (Content-Length) | Ağdan inen byte | DevTools Network, CDN log | Ana odak |
| Disk paketi | Tüm dosyalar toplamı | du, build raporu |
Modüler paket |
| JSON chunk ham | Organizasyon metni | GLB parser, metin editör | Overhead kalemi |
| Decode bellek | Runtime footprint | Performance monitor | Dışarıda (Runtime) |
«Küçük dosya = hızlı site» yarım doğrudur. Küçük transfer iyi başlangıçtır; ağır decode veya dev texture bellek yine kullanıcıyı yavaşlatır. Boyut ve zaman ayrı sayfalarda ölçülür, birlikte yorumlanır.
Envanter metodolojisi: üç satırlık rapor
BasisU sayfası ve Draco sayfası aynı Holodepth kuralını tekrarlar: dosya boyutu raporunda kalemler ayrı satır olmalıdır. Toplam MB yönetime sunulur; teşhis satır satır yapılır.
// Holodepth envanter şablonu (kavramsal)
1. Geometri + skin binary ?? MB (Draco / ham / sparse morph)
2. Texture binary ?? MB (PNG / JPEG / KTX2)
3. Animasyon + metadata ?? MB (accessor'lar + JSON chunk)
─────────────────────────────────
Transfer toplamı ?? MB
(+ HTTP Content-Encoding: gzip/br ayrı not)
GLB tek dosyada bu kalemler iç içe geçmiştir; ayırmak için glTF Inspector,
gltf-transform inspect, veya kendi script'inizle
buffers, bufferViews, images tablolarını
dolaşın. Modüler pakette model.bin ve textures/* dosya
sistemi seviyesinde ayrılmıştır; toplam paket boyutu dosya boyutlarının toplamıdır
(
GLB vs glTF · modüler
paket).
Kritik yol byte'ı vs paket toplamı
Modüler .gltf + paralel doku indirmede «ilk render» için gerekli minimum byte, paket toplamından küçük olabilir: düşük LOD mesh + düşük çözünürlük albedo. Envanter iki sütun taşımalıdır: Minimum LCP seti ve Tam kalite seti. Ürün kodu progressive load yapıyorsa bütçe minimum set üzerinden onaylanır; tam set arka planda gelir.
Geometri payı: köşe, index, morph, skin
Ham geometri boyutu (Draco öncesi düşünce) kabaca şu terimlerle tahmin edilir; kesin byte accessor ve bufferView hattında hesaplanır ( Binary Bufferlar). Dağıtım planlaması için yeterlidir:
- POSITION: vertexCount × 3 × 4 byte (float32)
- NORMAL: aynı sıra, çoğu mesh'te tam set
- TEXCOORD_0: vertexCount × 2 × 4 byte
- Indices: triangleCount × 3 × indexComponentSize (uint16/32)
- JOINTS + WEIGHTS: skinned mesh'te ekstra attribute katmanı
- Morph targets: targetCount × (POSITION + NORMAL delta)
Holodepth teşhis sırası: «geometri payı yüksek» ise önce triangle / vertex budget (LOD, decimate), sonra Draco ( Draco). Draco'yu yüksek poly üzerinde açmak transferi düşürür ama decode maliyeti ve kalite riski artar; boyut sayfası «önce poly budget» der, Runtime sayfası decode süresini ölçer.
Sparse morph ve boyut
Yüz morph'larında sparse accessor yalnızca değişen köşeleri yazar (
Morph
Targets · sparse). Envanterde morph'u
«tam vertex × target» ile çarpmak sparse dosyada yanlış alarm üretir; sparse
count ve indices boyutunu ayrı satır yazın.
Çoklu primitive ve tekrar
Aynı bufferView paylaşımı transferi düşürür; her primitive için ayrı Draco blob üretmek şişirir. Validator «duplicate buffer» uyarıları envanter ipucudur: birleştirme veya mesh merge export politikası boyutu doğrudan etkiler.
Doku payı: çözünürlük, slot, format
Çoğu «şişkin GLB» vakasında suçlu geometri değil, dokudur. PBR metallic-roughness
seti tipik olarak baseColor, normal, metallicRoughness (veya ayrı metal/rough),
occlusion; clearcoat/transmission ile slot sayısı artar (
PBR Yapısı). Boyut planlamasında her
images[] kaydı ayrı satırdır.
| Format | Transfer | Boyut planlama notu |
|---|---|---|
| PNG/JPEG harici | Ham görüntü byte'ı | 4K albedo tek başına MB'lar; modüler cache ile yönet |
| PNG gömülü (GLB) | BIN içinde | GLB toplamını şişirir; dedup yok |
| KTX2 / BasisU | Sıkıştırılmış GPU texture | Transfer düşer; transcoder gerekir ( BasisU) |
| data URI (base64) | ~%33 şişme + JSON içi | Üretimde kaçının ( GLB vs glTF · data URI) |
Çözünürlük bütçesi ürün kararıdır: e-ticaret mobili 1K, hero desktop 2K gibi profiller dokümantasyonla sabitlenir. Boyut analizi «4096 her slot» varsayımını kırmalıdır. Normal map genelde baseColor ile aynı çözünürlükte olmak zorunda değildir; düşük normal çoğu vitrinde kabul edilebilir kazançtır.
Paylaşılan doku ve envanter çift sayımı
Modüler pakette aynı PNG iki materyalde URI ile paylaşılırsa transfer bir kez sayılır (cache hit). GLB'de aynı görüntü iki kez gömülmüşse byte iki kez sayılır. Envanter «unique image byte» ve «toplam gömülü image byte» diye ikiye ayrılmalıdır.
Animasyon ve skin payı: sık genelde sıkıştırılmaz
glTF animasyon verisi animations[] içinde accessor'larla taşınır;
keyframe sayısı × channel sayısı × bileşen boyutu (
Keyframe Mantığı). Draco geometriyi sıkıştırır;
animasyon accessor'ları çoğu web pipeline'ında ham float kalır.
Uzun kemik animasyonlu karakterlerde «mesh küçük, GLB büyük» teşhisinin üçüncü
satırı animasyondur.
- Translation / rotation / scale kanalları: joint sayısı × süre × örnekleme sıklığı
- Weights (morph): target sayısı × keyframe ( Channels · weights)
- Inverse bind matrices: skin başına sabit IBM bloğu ( Skinning)
- CUBICSPLINE: output boyutu 3× ( Channels · CUBICSPLINE)
Holodepth üretim notu: kullanılmayan clip'leri export'tan çıkarın; aynı hareketin LINEAR dense sample'ı gereksiz byte biriktirir. Boyut optimizasyonu burada «clip envanteri» ve örnekleme seyreltmedir; Draco değil.
JSON, extras ve GLB padding
Organizasyon JSON'u çoğu büyük pakette toplamın %1-5'i civarındadır; küçük prop modellerinde oran yükselir. Yine de «görünmez şişme» kaynakları vardır:
extras/ vendor metadata: debug isimleri, DCC notları; binlerce string birikebilir- Gereksiz
namealanları: her node/mesh'te uzun isimler - GLB chunk padding: 4-byte hizalama; çok chunk'ta birleşik overhead
- Indent'li JSON export: insan okunur .gltf üretimde sorun değil; gömülü JSON chunk'ta whitespace strip edilir
JSON şeması ve GLB chunk yapısı JSON Yapısı'nda; bu sayfa «metadata diyeti» önerir: üretim GLB'de extras temizliği CI kapısı. Boyut kazancı küçük ama diff ve gizlilik (DCC path sızıntısı) açısından değerli.
GLB padding pratik etkisi
Tek bir 3 byte görüntü gömüsü bile chunk hizalamasıyla birkaç byte padding ekler; çok sayıda küçük gömülü image'de toplam padding hissedilir. Bu, «tam GLB» profilinde çok küçük dokuları birleştirmenin veya harici URI kullanmanın gerekçelerinden biridir; sayısal örnekler build'inize göre değişir, mutlak kural değil trenddir.
Sıkıştırma katmanları: HTTP, Draco, BasisU
Transfer boyutu üç bağımsız katmanın ürünüdür; birbirinin yerine geçmez:
- HTTP Content-Encoding (gzip / brotli): JSON chunk ve bazen tüm GLB üzerinde; CDN ayarı
- KHR_draco_mesh_compression: geometri semantic sıkıştırması; mekanizma Draco sayfasında
- KHR_texture_basisu: doku GPU sıkıştırması; BasisU sayfasında
Holodepth rapor formatı: her katman için «önce / sonra» byte. Örnek kavramsal tablo:
| Kalem | Ham export | Draco/Basis sonrası | + gzip transfer |
|---|---|---|---|
| Geometri | 12 MB | 1.2 MB | ~1.0 MB |
| Dokular | 28 MB | 4 MB (KTX2) | ~3.8 MB |
| Animasyon | 2 MB | 2 MB | ~0.5 MB |
| JSON + padding | 0.3 MB | 0.3 MB | ~0.05 MB |
Tablodaki rakamlar illüstratiftir; sizin build'inizde mutlaka ölçün. «Yalnızca Draco açtık» ile «dokular hâlâ PNG 4K» kombinasyonu BasisU · Draco ile birlikte uyarısını doğrular: iki uzantı farklı kalemleri hedefler.
EXT_meshopt_compression (kısa not)
Bazı pipeline'larda meshopt geometri ve bufferView düzeyinde ek kazanç verir; Draco ile birlikte veya alternatif olarak değerlendirilir. Holodepth envanterinde ayrı satır: «meshopt binary». Derin uzantı sayfası planlandığında mekanizma orada; boyut sayfası yalnızca «üçüncü geometri sıkıştırıcı adayı» olarak not eder.
Konteyner ve toplam paket hesabı
Aynı sahne GLB veya modüler paketlendiğinde ham içerik byte'ı aynı kalabilir; fark JSON tekrarı, padding ve HTTP başlıklarındadır. Modüler pakette toplam paket boyutu:
size(model.gltf) + size(model.bin) + Σ size(each images[].uri target)
GLB'de:
size(model.glb) // tek Content-Length; iç envanter kalem ayrımı parser ile
CDN faturalandırması ve kullanıcı kotası «toplam indirilen byte» üzerinden işler; modüler pakette cache hit ile ikinci ziyarette toplam düşer. İlk ziyaret envanteri ile tekrar ziyaret envanteri ayrı raporlanmalıdır ( GLB vs glTF · önbellek).
Bütçe kademeleri (Holodepth öneri çerçevesi)
Mutlak MB limiti ürüne göre değişir; çerçeve hedef koymak içindir:
- Mobil vitrin (LCP seti): transfer toplamı düşük tutulur; tam set ayrı lazy
- Desktop hero: tam set daha yüksek; yine kalem raporu zorunlu
- Configurator SKU: variants tek dosyada; boyut SKU sayısıyla çarpılmaz ( Variants)
Bu kademeler politika belgesidir; ölçüm olmadan onaylanmaz. Her release'de aynı envanter şablonu doldurulur; regresyon «geometri +2 MB» gibi satır satır görünür.
Holodepth perspektifleri: çoğu dokümanda olmayan açılar
«gltf-pipeline optimize edin» genellemesi yerine aşağıdaki üretim gerçekleri boyut teşhisini hızlandırır.
Yalnızca toplam MB raporu
Yönetime «38 MB» sunup kalemleri gizlemek yanlış öncelik üretir: ekip Draco ile uğraşırken asıl sorun 32 MB PNG'dir. Holodepth CI çıktısı minimum üç satır + toplam şarttır.
Disk boyutu = transfer sanmak
Repo'daki GLB dosya boyutu ile gzip'li CDN cevabı farklıdır. Bütçe onayı Network
sekmesindeki Content-Length (ve encoding) ile yapılmalıdır.
IBM + morph + animasyon üçlüsü
Karakter paketinde Draco sonrası mesh küçük görünür; IBM, morph delta ve weights animasyonu toplamı «gizli üçüncü ayak» olabilir. Tam karakter envanterinde dört satır: Draco mesh, KTX2 doku, morph/sparse, animasyon ( BasisU · morph notu).
Ağır normal + ORM, hafif albedo
Sanatçı albedo'yu 1K tutup normal ve ORM'yi 4K export ederse kalem tablosu dengesiz görünür. Slot bazlı çözünürlük politikası boyut sayfasının ürün uzantısıdır.
Variants ≠ boyut tasarrufu otomatik
Variants tek dosyada çok materyal taşır; her materyal kartı kendi texture set'ine sahipse GLB yine büyür. Boyut kazancı «mesh kopyası yok»tur; doku seti çoğaltması hâlâ envanterde sayılır.
Ölçüm araçları (üst seviye)
- Tarayıcı Network: transfer gerçeği, encoding header
- glTF Inspector / viewer: buffer ve image listesi
- gltf-transform inspect / optimize: kalem ayrımı ve rapor
- CI script: build sonrası otomatik üç satır + eşik alarmı
Dokuz soruluk boyut teşhisi
| Soru | Yeşil ise | Kırmızı ise bak |
|---|---|---|
| Üç kalem ayrı raporlandı mı? | Teşhis mümkün | Toplam MB yanıltıcı |
| Texture > geometry payı biliniyor mu? | Doğru optimizasyon sırası | Gereksiz Draco odaklı iş |
| KTX2 / Draco ikisi de değerlendirildi mi? | Dengeli uzantı profili | Tek uzantı yarım çözüm |
| Kullanılmayan animasyon clip var mı? | Animasyon payı minimal | Gizli MB |
| data URI veya base64 var mı? | Temiz paket | JSON şişmesi |
| Gömülü duplicate image var mı? | GLB dedup veya harici URI | İki kez sayılan byte |
| Transfer gzip/br ölçüldü mü? | Gerçek CDN maliyeti | Disk boyutu yanlış bütçe |
| LCP minimum set tanımlı mı? | Mobil bütçe anlamlı | Tam paket ile LCP karışık |
| Release diff satır satır mı? | Regresyon yakalanır | «Biraz büyüdü» belirsiz |
Holodepth içgörüsü
«GLB hâlâ büyük» ticket'ında önce Network'te en büyük tek istek
hangisi bakın; modüler pakette en büyük dosya genelde *.png veya
*.ktx2'dir. Draco'yu ikinci aşamaya bırakın. Boyut sayfası
optimizasyon sırasını değiştirir: doku bütçesi → poly budget → Draco → animasyon
diyeti → JSON extras temizliği.
Byte envanteri tamam; sıradaki zaman metrikleri
«Ne kadar indirdik?» sorusu yanıtlandı. Web İçin Kullanım hattının son adımı bu byte'ları işlemenin zaman maliyetine iner:
- Runtime performans Runtime Performansı: JSON parse, Draco/KTX2 decode, GPU upload, waterfall süresi, frame time
Küçük transfer + ağır decode mümkündür; büyük transfer + hafif decode da. İki sayfa birlikte «mobilde neden takıldı?» sorusunu tamamlar. Format omurgası File Structure, Materyal, Animasyon ve Uzantılar dallarında kalır.
Format okuyucusu özeti: Dosya boyutu üç kalem + toplam olarak okunur; transfer, disk ve decode bellek karıştırılmaz. Draco ve BasisU farklı dilimleri küçültür; animasyon ve extras sık gözden kaçan paylardır. Ölçüm satır satır; optimizasyon önce doku ve poly, sonra uzantı profili.