Three.js · Varlık optimizasyonu · Materyal
Materyal optimizasyonu: Çizim ve shader disiplini
Materyaller, CPU’nun GPU’ya gönderdiği «dur ve şu yeni fırçayı al» ritminin ana tetikleyicilerinden biridir. Bu sayfa materyal sayısı ile draw call ilişkisini, shader maliyetini ve HoloDepth için pratik bir kontrol listesini bir araya getirir.
Çizim trafiğinin sayısal sezgisi için Draw call girişini ve doku tarafında Texture atlas sayfasını yan yana okuyun; burada odak materyal kimliği ve gölgelendirici yüküdır.
Materyal sayısı ve draw call ilişkisi
Daha önce draw call bölümünde değindiğimiz gibi; materyaller, işlemcinin ekran kartına gönderdiği «dur ve şu yeni fırçayı al» komutunun ana tetikleyicilerinden biridir.
Sektör gerçeği: Birbirinin aynısı olan yüz küre olsa bile, her birine
ayrı MeshStandardMaterial örneği atarsanız, motor çoğu akışta bunları
farklı çizim yolları gibi görür — paylaşım yoksa kazanç yoktur.
Optimizasyon: Aynı görsel ayarlara ihtiyaç duyan objeler arasında
materyal paylaşımı yapın. Tek bir materyal örneği oluşturup yüz
Mesh’e
aynı referansı verdiğinizde, Three.js bunları gruplamaya ve sürücüye
daha az «kimlik değişimi» iletmeye çok daha yaklaşır.
Pedagojik simülatör: materyal durumu ve maliyet
Texture atlas simülatörü doku bağlama ve çağrı sayısını hissettirir; bu panel atlasın kopyası değildir — odak materyal kimliği → durum değişimi → shader ağırlığı zincirindedir. «Materyal sayısı = draw call» diye tek satırlık eşitleme yapmaz; bunun yerine neden yolların kırıldığını ve hangi anahtarların CPU / GPU skorunu şişirdiğini gösteren yuvarlatılmış bir model sunar.
Öne çıkan — durum değişimi
—
Mesh sayısına
sabit
Durum —
Draw call ile durum değişimi aynı şey değildir: kaydırıcılar çoğu zaman yalnızca alttaki büyük rakamı (durum) oynatır; draw üstteki turkuaz kutuda sabit kalır.
Draw (üst sınır, model)
—
Bu panelde sabit
(Mesh başına bir çizim). Durum değişimi ayrı metrik —
ikisini karıştırmayın.
Ayrı materyal örneği
—
Paylaşılan referans sayısı değil, farklı örnek adedi.
Durum değişimi (detay)
—
Üstteki büyük rakamla aynı ölçek (0–250).
CPU yükü (0–100)
—
Durum yenileme + sahne karmaşıklığı (model).
GPU / shader ağırlığı (0–100)
—
GPU skoru log yumuşatmalıdır — doğrusal ölçekte her şey tavana çakılırdı.
Çubuklar 250 nesne / 250 durum ve 100 skor tavanına göre ölçeklenir — gerçek profil sahneye göre değişir.
Eğitim panelidir; gerçek draw ve durum sayısı frustum culling, birleştirilmiş geometri, sürücü batching ve materyal özdeşleştirme ile değişir. Ölçüm için tarayıcı ve motor profil araçlarını kullanın.
HoloDepth teknik notu
«Yüz küre = yüz draw call» cümlesi pedagojik sadeleştirmedir. Gerçek sayı frustum culling, birleştirilmiş geometri, instancing ve sürücü batching ile değişir; ama her küreye ayrı materyal vermenin maliyetinin büyüdüğü yön doğrudur.
Shader maliyeti: GPU’nun matematik yükü
Her materyal, arka planda bir shader (renklendirme programı) çalıştırır. Shader ne kadar karmaşıksa, GPU her piksel için o kadar çok matematiksel hesaplama yapar.
PBR vs. basit materyal
- MeshStandardMaterial: Işık yansımaları, pürüzlülük ve metalik için ağır formüller kullanır; çok gerçekçidir ama maliyetlidir.
- MeshBasicMaterial / MeshPhongMaterial: Işık hesaplarını sadeleştirir veya kısmen devre dışı bırakır; uzak objeler veya performans öncelikli sahneler için sık kullanılır.
Gereksiz özellikleri kapatmak
Kullanmadığınız her özellik, shader kodunda fazladan dal ve örnek maliyeti demektir.
- Obje şeffaf değilse
transparent: trueaçmayın — derinlik ve sıralama yükünü şişirir. side: THREE.DoubleSideyalnızca gerektiğinde; iç yüzeyleri de çizmek pratikte yükü artırır.
«Görsel fark gerçekten gerekli mi?» (kritik karar)
§2’deki shader yükü ve gereksiz özellikleri kapatma disiplini, sahneye indiğinde tek bir soruya indirgenebilir: bu detay, izleyici için gerçekten ölçülebilir mi? Bu düşünce, §1’deki «aynı malzemeyi paylaş» hedefiyle çelişmez; ayrı materyal / ayrı doku gerektirmeyen varyantları erken eleyerek hem çizim kimliğini hem piksel başına işi sınırlar.
HoloDepth projelerinde materyal kurgularken şu soruyu sormak gerekir: «Kullanıcı bu detayı iki metre öteden fark edecek mi?» «İki metre» örnektir; asıl ölçüt tipik izleme mesafesi, ekran çözünürlüğü ve sahne yoğunluğu için iç tartınızdır.
Normal, albedo ve çevre
Normal map ve geometri: Çok ince yüzey detayı için poligon eklemek — yükü §1’in öte ucundaki geometri ve çizim tarafına itmek — yerine normal haritası kullanın. Obje uzaklaştıkça aynı normalın verdiği mikro yansıma hissi zayıflar; bu aşamada normal dokusunu kapatıp yalnız albedo (taban renk) ile yetinmek, doku örnek sayısını ve §2’deki «boşta taşınan kanal» riskini birlikte azaltır.
Environment / yansıma: Her küçük metal parçasına sürekli güncellenen yansıma veya yoğun probe zinciri bağlamak, özellikle web ve mobil tarafta GPU ile bellek bantını zorlayabilir. HDRI / çevre hattında statik veya seyrek güncellenen, sahneye ölçülü seçilmiş bir çevre haritasıyla yetinmek çoğu HoloDepth senaryosunda daha ekonomiktir; böylece ağır PBR yolunu tamamen iptal etmeden yansıma işinin kapsamını sınırlamış olursunuz.
Materyal optimizasyon reçetesi
Aşağıdaki liste, §1 (paylaşım ve çizim kimliği), §2 (shader ve gereksiz bayraklar) ile §3 (görsel karar) başlıklarının üretim sırasına konmuş özetidir; yeni bir yöntem ailesi önermez, aynı ana konuları uygulamaya döker.
Profesyonel bir 3D web pipeline için kontrol listesi:
- Materyal havuzu (pooling): Benzer görünüme
ihtiyaç duyan objeler için tek materyal örneği oluşturup aynı
referansı paylaştırın; doğrudan §1’deki materyal başına çizim yükünü hedefler. Taslak
aşamasında bile her
Meshiçin ayrınew MeshStandardMaterial()üretmeyi alışkanlık haline getirmeyin. - Shader seviyelendirme (LOD):
Yakın ve kahraman objeler için
MeshStandardMaterial; arka plan ve uzak kütleler içinMeshLambertMaterialveya ışıktan bağımsız ihtiyaçlardaMeshBasicMaterialdüşünün. Bu, §2’deki ağır / hafif shader ayrımının sahne içi uygulamasıdır. - Kanal paketleme: Roughness, metalness ve ambient occlusion verilerini tek dokunun R / G / B kanallarında birleştirerek örnek ve dosya sayısını düşürün; atlas reçetesindeki kanal disiplini ile hizalı kalırsınız — böylece hem bellek hem §1’deki materyal–doku eşlemesi sadeleşir.
- Alpha test vs. şeffaflık: Keskin yaprak kenarı
gibi «ya var ya yok» siluetlerde, §2’de uyarılan
transparent: trueyoluna düşmeden öncealphaTestdeğerini deneyin; blending ve derinlik sıralaması maliyetinden kaçınmak mümkün olabilir. Yumuşak kenar ve cam gibi durumlarda şeffaflık hâlâ gerekli olabilir — tek çözüm değildir.
HoloDepth teknik notu: «Daha az, daha çoktur»
Materyal sayısını düşürmek için dokuları texture atlas + simülatör çizgisinde hazırlamak iyi eşleşir. Tek materyal + tek atlas ile çok sayıda objeyi aynı «malzeme ailesinde» toplamak, web GPU performansında sık hedeflenen bir kazançtır — yine de shader varyantı ve şeffaflık gibi nedenlerle «tek draw call sihri» her zaman gerçekleşmez; atlas sayfasındaki model bunu sayıyla gösterir.
Aynı uyarıyı materyal tarafında hissettirmek için §1’deki durum simülatörünü açıp shader tipi ile şeffaflığı oynatın: atlas tek başına yetmez dediğimiz «kırılma» burada sayıya dökülür.
Sonraki okuma
Bu blok içinde doğrudan sonraki adım: Geometri karmaşıklığı (poligon bütçesi). Birleştirme stratejileri için ayrıca Buffer birleştirme dizisine; motor içi materyal ayrıntıları için Materyaller giriş sayfasına devam edebilirsiniz.