Tüm yazılar
Eğitimler · 7 min read

100.000 varlıklı bir kütüphaneyi, o seni evcilleştirmeden önce evcilleştirmek

Kendi kendini sıralayan adlandırma kuralları, klasörlere karşı etiketler, küçük resim boru hatları, kopya politikası ve fırsatçı taşıma: devasa bir oyun varlık kütüphanesini bulunabilir tutmak için pratik bir sistem, ve arama hızının seviyelerinin ne kadar çeşitli göründüğüne nasıl karar verdiği.

Illustration of an asset thumbnail grid with a search field and tag chips

Kısaca: ortam kalitesi, sanatçıların bir dakikadan kısa sürede bulabildiğiyle sınırlıdır. Birkaç bin varlığın ötesinde klasör disiplini ölçeklenmeyi bırakır: arama artı etiketler devralır, küçük resimler tarama hızına karar verir, kopyalar bir tasfiye değil bir politika ister, ve taşıma kahramanca değil fırsatçı olmalıdır. İşte büyümeye dayanan bir sistem, kopyalamaya değer somut kurallar ve her birinin ölçekte neden önemli olduğuyla.

Bir kütüphanenin okuma salonu, sıcak ışıkta raflar Bir kütüphane bir kitap yığını değildir: kitaplar artı bir bulma sistemidir. Varlık koleksiyonunuz ancak ikinci kısım varsa bir kütüphanedir; yoksa çok pahalı bir yığındır.

Dağınık bir kütüphanenin gerçek maliyeti

Doğru kayayı bulmak dört dakika sürünce, sanatçılar birinden sonra aramayı bırakır: sahneler aynı yirmi hatırlanan varlıkta buluşurken binlerce satın alınmış paket açılmadan durur.

Hasar ekranda görünür: oyuncuların hissettiği tekrar, hiç gönderilmeyen paketlere harcanan para, ve her giydirme saatine sessiz bir vergi. Kuralı söylemenin daha keskin bir yolu var: yaklaşık bir dakikada bulunamayan bir varlık fiilen yoktur. Ona ödedin, saklıyorsun, yedekliyorsun, ve asla bir seviyede görünmeyecek. Bulunabilirlik ev işi değildir; görsel çeşitliliğinin üst sınırıdır. Aynı varlık bütçesine sahip iki stüdyo, biri varlıklarını bulabiliyorsa diğeri bulamıyorsa gözle görülür biçimde farklı görünen oyunlar gönderir.

Adlandırma: sıkıcı, sıralanabilir, muğlak olmayan

Bir kural ancak düz bir listede yararlı sıralanırsa işe yarar: tür ön eki, kategori, malzeme veya tür, boyut, indeks. Boşluk yok, "final_v2_NEW" yok.

Kanıtlanmış bir biçim:

SM_Rock_Granite_Large_01        (static mesh)
SM_Rock_Granite_Large_01_LOD1
T_Rock_Granite_D / _N / _R      (textures: diffuse, normal, roughness)
M_Rock_Granite                  (material)
MI_Rock_Granite_Mossy           (material instance)

Onu ölçekte işler tutan kurallar: kavram başına bir kelime (Rock, birbirinin yerine kullanılan Rock/Stone/Boulder değil), en çok filtrelenen alanı erken koy ki sıralama yararlı gruplasın, indeksleri sıfırla doldur (01, 1 değil) ki 10, 2'den önce sıralanmasın, ve kuralı herkesin ilk gün okuduğu tek sayfaya yaz. Kesin şema, tam olarak birinin olmasından çok daha az önemli, ve bugün başlamak, hangi boyuttaysan, çünkü 50.000 dosyaya adları sonradan uydurmak, kimsenin asla bitirmediği ve ertelemesinden herkesin pişman olduğu projedir.

Klasörler bir şey söyler; etiketler gerisini söyler

Bir dosya TEK bir klasörde yaşar ama birçok özelliği vardır: klasörler sahipliği ve boru hattını kodlamalı (hangi paket, hangi proje), etiketler arayacağın her şeyi kodlar: biyom, malzeme, ruh hâli, boyut, stil.

Çok boyutluluğu daha derin klasör ağaçlarıyla dövmek, hiçbir şeyin bir daha bulunamadığı klasik Props/Nature/Trees/ Dead/Moss/ mezarlığını üretir, çünkü yosunlu ölü bir huş beş klasöre birden aittir ve yalnız birinde yaşayabilir, bu yüzden hep yanlış dörtündedir. İşleyen ayrım, aramayı ana giriş yolu, klasör ağacını salt tesisat yapar.

Çoğu ortam işini kapsayan bir etiket sözlüğü, ekiplerin beklediğinden küçüktür: biyom (orman, çöl, kentsel…), malzeme (ahşap, granit, paslı…), durum (kusursuz, aşınmış, harabe), boyut sınıfı ve stil: beş eksen, belki kırk terim, bir kez üzerinde anlaşılmış ve uygulanmış. Disiplin, sözlüğü kapalı tutmaktır: birinin uydurduğu her yeni eşanlamlı ("yıpranmış" ile "aşınmış" yan yana) iki etiketin de değerini yarıya indirir, çünkü birinin araması diğerini ıskalar.

Küçük resimler arama kalitesine karar verir

Dosya adları listesi bir kütüphane değildir: tutarlı küçük resimler (aynı açı, nötr ışık) gözün dakikada yüzlerce adayı taramasına izin verir, ki bu giydirmenin ihtiyaç duyduğu gerçek hızdır.

İnsan görüşü, bir küçük resim ızgarasını adları ayrıştırmasından çok daha hızlı değerlendirir; onu işler kılan tutarlılıktır, çünkü varlıktaki farklar sunum özdeş olduğunda görünür kalır. Rastgele açı ve rastgele ışıkta çekilmiş bir kaya kendi biçimini gizler; aynı kaya standart bir dörtte üç görünümde nötr ışık altında onu anında açığa vurur. Onları toplu render et, bir küçük resim boru hattı, herhangi büyük bir projenin ilk haftasında kendini amorti eder.

Küçük resimler ayrıca ölçeğin acıttığı yerin tam kendisidir: yüz binini gezinmek sanallaştırma, önbellekleme ve editörü yetişirken donduran değil arka planda render eden bir boru hattı ister. O mühendislik sorunu, tam anlamıyla Numivo'ya milyon varlıkta akıcı kalan, anlık küçük resimli ve "şu bir yerdeki yosunlu uçurum parçasını" iki kelimelik bir aramaya çeviren isteğe bağlı yapay zekâ etiketlemeli bir içerik tarayıcısı kurmamızın nedenidir. Tarayıcı sorunu ile adlandırma sorunu farklı katmanlardaki aynı sorundur: ikisi de "bir şeye ihtiyacım var" ile "şeye bakıyorum" arasındaki mesafeyi çökertmekle ilgilidir.

Binlerce neredeyse özdeş birimden tuğla duvar Kopya sorunu, fizikselleştirilmiş: binlerce neredeyse özdeş birim. Beceri, bulunabilir kanonik bir sürümü tutmak ve gerisini sessizce indirmek, bir duvarın hâlâ dayandığı bir şeyi silmemek.

Kopyalar: birini tut, gerisini etiketle

Neredeyse kopyaları gördüğün yerde silme (referanslar kırılır): kanonik bir sürüm seç, diğerlerini duplicate etiketle, varsayılan aramadan filtrele, ve hiçbir şey onlara referans vermeyince gerçekten emekliye ayır.

Uzun ömürlü her proje örtüşen paketler biriktirir: dört tedarikçiden dört granit kaya, yalnız bir kulpla ayrılan üç fıçı. İki adımlı politika (şimdi indir, sonra sil) bulunabilirlik kazancını hemen sıfır kırılma riskiyle yakalar: kopyalar aramadan kaybolur ama onlara zaten referans veren her sahne için diskte kalır. Referans taramasını üç ayda bir çalıştır; altı ay referanssızlık genellikle mezarlığı güvenle toptan boşaltır.

Kaçınılacak başarısızlık modu, kopyaları bulduğun gün silmektir: sildiğine hep bir şey referans verir, bir seviye kırılır, ve ekip temizlikten korkmayı öğrenir, sonrasında kimse hiçbir şey temizlemez. İndir-sonra-sil temizliği güvende tutar, ve güvenli temizlik olmaya devam eden tek temizliktir.

Taşıma: kaostan sisteme

Büyük patlama temizliği için üretimi asla durdurma: kuralı bugünden itibaren her YENİ olana uygula, sonra eski içeriği fırsatçı taşı: bir seviyenin içeri çektiği ne olursa olsun geçerken yeniden adlandırılır ve etiketlenir.

Fırsatçı kuralın güzel bir özelliği var: önemli varlıklar önce taşınır, tanımı gereği, çünkü onlar kullanılanlardır. Bir yıl sonra dokunulmamış her şey soğuk depoya aittir, arama sonuçlarına değil, ve hiç taşınması gerekmedi. Bunun yerine kahramanca hafta sonu temizliğini deneyen ekipler, yarı yeniden adlandırılmış bir kütüphane üretme eğilimindedir, iki uçtan da kesinlikle daha kötü, çünkü artık arama sonuçları iki kuralı karıştırır ve hiçbirine güvenilmez.

Çalmaya değer saha rakamları

  • Bulunabilirlik bütçesi: 1 dakikanın altı, yoksa varlık işlevsel olarak yoktur
  • Ortam işini kapsayan etiket sözlüğü: ~5 eksen, ~40 kapalı terim
  • Tutarlı render ile küçük resim tarama hızı: dakikada yüzlerce
  • Kopya politikası: hemen indir, ~6 ay referanssız kaldıktan sonra sil
  • Adlandırma: sıfırla doldurulmuş indeksler, kavram başına bir kelime, bir sayfa kural

Mini-SSS

Yapay zekâ etiketleri manuel etiketlemeyi değiştirecek kadar iyi mi? Çoğunu değiştirecek kadar iyi: otomatik etiketler yükün büyüğünü taşır (konu, malzeme, renk), insanlar takdir gerektirenleri ekler (stil uyumu, projeye özgü terimler). Kombinasyon tek başına her ikisini de yener, bu yüzden yapay zekâ etiketleme, tam bir yerine geçme değil, isteğe bağlı bir yardımcı katman olarak en iyi çalışır.

Bir paylaşılan kütüphane mi, proje başına mı? Paylaşılan kaynak kütüphane, proje başına içe aktarma. Kütüphane her şeyi tam etiketlerle tutar; bir proje yalnız gönderdiğini çeker, build'leri yalın ve cook sürelerini kısa tutar. İkisini karıştırmak (tüm kütüphaneye referans veren bir proje) build boyutlarının şiştiği yerdir.

Peki ikili varlıkların sürümlemesi? Kütüphane bir bahçedir, bir arşiv değil: kaynak dosyaları DCC boru hattında sürümle, kütüphaneyi yalnız-en-iyi-güncel olarak tut. Arama sonuçlarında yaşayan tarihsel sürümler kimlik etiketi takmış gürültüdür, ve herkes için her aramayı yavaşlatır.

Bir ekibin kurala gerçekten uymasını nasıl sağlarım? Doğru olanı kolay olan yap: adlandırma desenini önceden dolduran bir kaydet/içe aktar şablonu, kural dışı dosyaları işaretleyen bir lint adımı, ve kurala uygun varlıkları bulunabilir, uymayanları görünmez kılan küçük resimler. Araçla dayatılan kural tutar; dırdırla dayatılan tutmaz.

Çirkin başla, şimdi başla: bir sayfalık adlandırma çizelgesi, on çekirdek etiket ve tutarlı küçük resimler, gelecek çeyrek başlayan güzel bir taksonomiyi yener. Kütüphaneler bahçedir: sürekli küçük yabani ayıklama, asla tek bir kahramanca temizlik.