Character Creator Karakteri — Material ve Doku Optimizasyonu
Optimizasyon R-007 Çizen: Alparslan TamamCharacter Creator çıktısı bir karakterin oyunda ne kadar ağır olduğunu tahmin etmek yerine ölçtük: skeletal mesh, 24 material slotu, arkasındaki 10 shader ve 140 dokunun tamamı editörün içinden tek tek okundu. Karakterde yanlış yapılmış bir şey yok; tek sorun hiç LOD olmaması — 15 metre uzaktaki karakter de yakın plandaki kadar pahalı çiziliyor. İlk yarı neyin sorun olduğunu, ikinci yarı bunun nasıl ve hangi sırayla düzeltileceğini anlatır. Finisher ve QTE yakın planı sonradan gelen bir kısıt olarak LOD0 / LOD1 ayrımını değiştirdi; o da içeride.
Unreal Engine 5.8 · Character Creator 4
Soru basitti: Character Creator’dan gelen ana karakter oyunda ne kadar ağır, nesi gereksiz, nesi lazım? Tahmin yürütmek yerine karakterin skeletal mesh’ini, 24 material slotunu, arkasındaki 10 shader’ı ve 140 dokunun tamamını editörün içinden tek tek okuduk. Aşağıdaki bütün sayılar ölçüm sonucudur.
Tek cümlelik özet
Karakterde yanlış yapılmış bir şey yok — Character Creator’ın standart çıktısı, yapısı da doğru. Tek sorun: hiç LOD’u yok, yani 15 metre uzaktaki karakter de yakın plandaki kadar pahalı çiziliyor. Yapılacak iş silmek değil, kademelendirmek.
Rapor yazıldıktan sonra gelen kısıt: finisher ve QTE
Ana karakter finisher veya QTE yaparken kamera yüze yaklaşacak. Yani yakın plan artık sadece sinematiğe ait değil, oynanışın içinde. Bu, LOD0 / LOD1 ayrımını doğrudan değiştirdi — ayrıntısı LOD0 / LOD1 slot haritası bölümünde.
Elimizde ne var
| Ölçü | Değer | Ne demek |
|---|---|---|
| Material slot | 24 | Karakter her karede 24 ayrı parça hâlinde çiziliyor |
| Farklı shader | 10 | 24 slot bu 10 shader’ı paylaşıyor — bu iyi |
| Doku sayısı | 140 | Tekrarsız |
| Doku hafızası (tavan) | 381 MB | Hepsi tam çözünürlükte açılsaydı |
| Vertex sayısı (LOD0) | 29 029 | Tek kademe — başka kademe yok |
| LOD sayısı | 1 | Sadece LOD0. Asıl mesele bu. |
| Morph target | 460 | Yüz ifadeleri + ağız hareketleri |
| Level Sequence | 0 | Sinematik henüz yok (ama yapılacak) |
Dokular boyuta göre
| Boyut | Adet | MB | Payı |
|---|---|---|---|
| 2048x2048 | 59 | 314.6 | 83% |
| 1024x1024 | 47 | 62.7 | 16% |
| 512x512 | 11 | 3.7 | 1% |
| 128x128 | 4 | 0.1 | 0% |
| 64x64 | 7 | 0.0 | 0% |
59 adet 2K doku, hafızanın %83’ünü tek başına tutuyor. Bir 2K doku bir 1K’nın tam 4 katı yer kaplar — bu yüzden “2K mı 1K mı” kararı en yüksek etkili karar.
En önemli bulgu: 24 slotun 19’u yüz için
Slotları vücut ve yüz diye ayırdığımızda tablo şöyle:
| Bölge | Slot | Doku hafızası | Payı |
|---|---|---|---|
| Yüz / kafa bölgesi | 19 | 267 MB | 70% |
| Vücut (gövde, kol, bacak, tırnak, iç çamaşırı) | 5 | 114 MB | 30% |
Oyun 2.5D yandan görünüşlü. Normal oynanışta karakter ekranda birkaç yüz piksel yüksekliğinde. O mesafede göz bebeğinin kırılma indisi, gözyaşı çizgisi ve kirpik telleri fiziksel olarak görünmüyor — ama motor hepsini yine de çiziyor.
Yüz bölgesindeki slotlar, tek tek
| Slot | Shader | Doku | MB |
|---|---|---|---|
| Std_Skin_Head | HQSkin | 27 | 69.6 |
| Brows_Hair_Transparency | Hair_Specular | 7 | 32.0 |
| Lash_Fine_Transparency | Hair | 7 | 32.0 |
| Lash_Thick_Transparency | Hair | 7 | 32.0 |
| CC_Base_Tear_Ducts | HQSkin | 14 | 31.3 |
| Std_Lower_Teeth | GumsTongueTeeth | 6 | 19.4 |
| Std_Upper_Teeth | GumsTongueTeeth | 6 | 19.4 |
| Std_Cornea_R | EyeRefractive | 7 | 6.0 |
| Std_Cornea_L | EyeRefractive | 7 | 6.0 |
| Brows_Base_Transparency | Standard_Opacity | 3 | 5.3 |
| Brows_Color_Transparency | Standard_Opacity | 3 | 5.3 |
| Std_Tongue | GumsTongueTeeth | 6 | 5.0 |
| Std_Eye_R | Standard | 3 | 1.7 |
| Std_Eye_L | Standard | 3 | 1.7 |
| Std_Eyelash | Eyelash | 3 | 0.4 |
| Std_Tearline_R | Tearline_Plus | 0 | 0.0 |
| Std_Tearline_L | Tearline_Plus | 0 | 0.0 |
| Std_Eye_Occlusion_R | EyeOcclusion_Plus | 0 | 0.0 |
| Std_Eye_Occlusion_L | EyeOcclusion_Plus | 0 | 0.0 |
Not: paylaşılan dokular, onları kullanan slotlara bölüştürülerek sayıldı; sütun toplamı gerçek toplama eşit çıkıyor.
Buradaki en çarpıcı kalem: kaş ve kirpik
Altı ayrı slot sadece göz çevresindeki kıl kartlarını çiziyor (Brows_Hair, Brows_Base, Brows_Color, Lash_Fine, Lash_Thick, Std_Eyelash) ve toplam 107 MB tutuyor. Bu, vücudun tamamıyla (114 MB) neredeyse aynı.
Bunlar ayrıca saydam (translucent) çiziliyor — saydamlık, motorun en pahalı çizim türüdür, çünkü arkasındaki her şeyi de hesaplamak zorunda kalır.
Shader’lar ne kadar ağır
“Instruction” = shader’ın her piksel için yaptığı işlem sayısı. Yüksek olması kötü değil, ama pahalı olanın büyük alan kaplamaması gerekir.
| Shader | Instr. | Sampler | Çizim | Shading model | Slot |
|---|---|---|---|---|---|
| Tearline_Plus | 1996 | 9 | TRANSLUCENT | DEFAULT_LIT | 2 |
| Eyelash | 572 | 9 | TRANSLUCENT | HAIR | 1 |
| Hair_Specular | 564 | 7 | MASKED | HAIR | 1 |
| Hair | 564 | 7 | MASKED | HAIR | 2 |
| EyeRefractive | 505 | 4 | OPAQUE | EYE | 2 |
| EyeOcclusion_Plus | 480 | 2 | TRANSLUCENT | UNLIT | 2 |
| HQSkin | 455 | 2 | OPAQUE | SUBSURFACE_PROFILE | 6 |
| GumsTongueTeeth | 387 | 2 | OPAQUE | SUBSURFACE_PROFILE | 3 |
| Standard | 313 | 8 | MASKED | DEFAULT_LIT | 2 |
| Standard_Opacity | 311 | 8 | MASKED | DEFAULT_LIT | 3 |
Tearline (gözyaşı çizgisi) shader’ı 1996 instruction ile listenin tepesinde — cildin (455) dört katından fazla. Ekranda kapladığı alan ise birkaç piksel. Yakın planda değerli, oynanışta tamamen israf.
Sampler sınırı 16’dır ve bu motor kaynağında sabittir. Hiçbir shader’ımız sınırı zorlamıyor (en yüksek 9), yani o tarafta sorun yok.
“Shader şu kadar instruction’ı geçmesin” diye resmî bir sayı da yok; internette dolaşan rakamlar kişisel görüş. Karşılaştırma için bu karakterin kendi değerlerini kullanıyoruz: cilt 455, en pahalı 1996.
Yüz animasyonu var mı? — ölçtük
Bu soru raporun kilidiydi, çünkü cevap “hayır” olsaydı yüz maliyetinin çoğu boşuna olurdu. Ölçüm sonucu:
| Ne arandı | Sonuç |
|---|---|
| Morph target (blendshape) | 460 adet mevcut |
| Bunların viseme (ağız/konuşma) olanı | 15 |
| Yüz kemikleri | jaw, upperjaw, sol/sağ göz, dil (3), diş (2) — hepsi var |
| Bunları süren animasyon curve’ü | 0 — hiçbir animasyonda yok |
Sonuç: yüz rigi tamamen kurulu, ama şu an hiçbir şey onu kullanmıyor.
Yani bugün itibarıyla kırışıklık haritaları ve yüz detayının tamamı ölü ağırlık. AMA sinematikler planlanıyor, finisher ve QTE yakın planı geliyor ve bu oyunun ana karakteri. Dolayısıyla doğru karar SİLMEK değil, oynanışın uzak planında devre dışı bırakmak.
Kritik uyarı: 460 morph target mesh dosyasının içinde duruyor ve doku hafızasıyla hiç ilgisi yok — o 381 MB’ın tamamen dışında, ayrı bir maliyet.
“381 MB” ne demek, ne demek değil
Bu sayı bir tavandır, sürekli ödenen bir bedel değil.
140 dokunun hepsi “streaming” modunda: motor karakter uzaktayken düşük çözünürlüklü hâlini tutar, yakınlaştıkça yükseğini yükler. Hiçbiri “asla stream etme” işaretli değil. Dolayısıyla oynanış sırasında hafızada duran miktar 381 MB’ın çok altındadır.
Bu, dokuların önemsiz olduğu anlamına gelmez — ama şunu değiştirir: asıl kazanç doku silmekten değil, çizim sayısını (24 slot) ve shader ağırlığını azaltmaktan gelir. Streaming doku maliyetini zaten yönetiyor; çizim maliyetini yönetmiyor. Bu yüzden doku ayarları iş listesinin başında değil, sonunda.
Yine de iki somut düzeltme çıktı:
| Bulgu | Değer | Neden önemli |
|---|---|---|
| Grayscale (tek kanal) doku | 26 adet / 101 MB | Sıkıştırılmamış kaydediliyor; maskeler tek dokunun R/G/B kanallarına paketlenirse üçte birine iner |
| Doku grubu ataması | 125 doku WORLD grubunda | Karakter dokuları CHARACTER grubunda olmalı — streaming önceliğini o belirliyor |
Dikkat: bunlara dokunma
Tearline ve Eye Occlusion mesh’lerini silme.
Tearline göz kapağı ile göz küresinin buluştuğu ıslak çizgiyi, Eye Occlusion ise göz kapağının göz küresine düşürdüğü gölgeyi taklit eden ayrı küçük mesh’lerdir. İkisi de yüz blendshape’leriyle birlikte deforme olur. Reallusion’ın kendi hata kayıtlarında, silindikten sonra geri eklendiklerinde blendshape bağlantılarının kopması bilinen bir sorun olarak duruyor. Yani silmek geri dönüşü olan bir işlem değil.
Doğru yol: silmek yerine LOD1’de o section’ı kapat. Model bozulmaz, oynanışta çizilmez, yakın planda LOD0 ile geri gelir.
Kullanılmayan 19 material instance çöp değil.
Klasörde mesh’e bağlı olmayan HQ ve LWHQ isimli material instance’lar var. Bunlar Character Creator’ın hazır kalite kademeleri — yüksek kalite ve hafif-yüksek kalite setleri. Daha önce bunları “silinebilir” diye değerlendirmiştim, yanlıştı: LOD1 için hazır bir material seti olarak doğrudan işimize yarayacaklar.
Buradan çıkan kural tek satır: hiçbir slotu ve hiçbir mesh parçasını silme; tüm sadeleştirme LOD1 ve LOD2’de, section seviyesinde yaşasın. LOD0 hiç değişmeden dursun; finisher, QTE ve sinematik ondan beslensin.
Çözüm: LOD kademeleri
LOD = bir modelin uzaklığa göre devreye giren daha ucuz versiyonları. Şu anda karakterin hiç yok, o yüzden her mesafede en pahalı hâli çiziliyor.
Unreal’de bir LOD kademesi sadece üçgen azaltmakla kalmaz:
- Bir parçayı (section) tamamen kapatabilir — o slotun dokuları da yüklenmez.
- Farklı bir material’e yönlendirebilir — LOD1’de basit cilt shader’ı kullanmak gibi.
- Kemik silebilir — yüz ve parmak kemikleri uzaktan gerekmez; ayrıca pozu “pişirerek” (bake pose) silinen kemiklerin etkisini korur.
Kademelendirme
| Kademe | Nerede kullanılır | Ne içerir |
|---|---|---|
| LOD0 | Sinematik, finisher, QTE, yakın plan | Şu anki hâli — hiçbir şey değişmez |
| LOD1 | Normal oynanış | Tearline, eye occlusion, cornea, dil, dişler kapalı; kaş/kirpik tek slota indirilmiş; ciltte basit shader; yüz kemikleri duruyor |
| LOD2 | Uzak plan / kalabalık | Yüz tek slot; kaş-kirpik doku üzerine yedirilmiş; yüz kemikleri silinmiş |
Bunun en kolay yolu Unreal değil, Character Creator.
CC 4.1 ve sonrasında InstaLOD tabanlı bir optimizasyon paneli var: Character Scalability (kemik sayısı, poligon, doku boyutu, yüz detayı için kaydedilebilir profiller), Merge Material (her şeyi tek material’e ya da Karakter / Saç / Kıyafet / Aksesuar diye dört gruba indirip tek atlasa pişirir) ve 5 kademeye kadar LOD üretimi.
Önemli: bu işlem EXPORT’TAN ÖNCE CC içinde yapılmalı. Unreal tarafındaki Auto Setup eklentisi LOD üretmiyor — sadece hazır gelen LOD’ları bağlıyor. Şu an LOD olmamasının sebebi tam olarak bu: CC’deki bu adım hiç çalıştırılmamış.
İşin kaba sırası
Buradan sonrası “nasıl yapılır”. Bölümler yukarıdaki bulguların sırasını takip ediyor, ama işi bu sırayla yap: LOD üretimi listenin başında, çünkü diğer her şey onun çıktısının üstüne kuruluyor.
| Sıra | Ne | Nerede | Kim |
|---|---|---|---|
| 1 | LOD üretimi (LOD1 + LOD2) | Character Creator | Animatör |
| 2 | Export ve içe aktarma | CC → Unreal | Animatör |
| 3 | LOD başına slot haritası | Unreal | Motor tarafı |
| 4 | Finisher / QTE için LOD zorlama | Unreal | Motor tarafı |
| 5 | Doku ayarları (kanal paketi, doku grubu) | CC / Unreal | İkisi |
| 6 | Material mimarisi (düşmanlar için) | Unreal | Motor tarafı |
| 7 | Sinematik kalite kurulumu | Unreal | Motor tarafı |
LOD üretimi (en büyük iş, Character Creator’da)
Bu, listedeki en yüksek etkili adım ve tamamen CC tarafında.
- CC’de karakteri aç ve Character Scalability panelini kullan. Kemik sayısı, poligon, doku boyutu ve yüz detayı için ayrı ayrı hedef verilir; profil olarak kaydedilebilir.
- LOD1 profilini kur. Hedef: normal oynanış. Poligon makul ölçüde düşer, yüz kemikleri KORUNUR (finisher yakın planı için gerekli), yüz detayı bir kademe iner.
- LOD2 profilini kur. Hedef: uzak plan. Poligon agresif düşer, yüz kemikleri silinebilir, kaş/kirpik dokuya yedirilir.
- Gerekiyorsa Merge Material’ı yalnızca LOD2’de uygula. Karakter / Saç / Kıyafet / Aksesuar diye dört gruba indirip tek atlasa pişirir. LOD0 ve LOD1’de UYGULAMA — cilt, göz ve saç farklı shading model kullanıyor, birleştirince o ayrım kaybolur.
- Hepsini birlikte export et. LOD’lar aynı export’ta gelmeli ki Unreal tarafı tek parça bağlayabilsin.
Bitti sayılır: Unreal’de mesh’in LOD sayısı 3 görünüyor ve LOD1/LOD2 seçildiğinde model bozulmadan sadeleşiyor.
LOD1’de yüz kemiklerini silme
Finisher ve QTE yakın planı LOD0’da geçse bile geçiş anında LOD1 görünebilir. Yüz kemikleri LOD1’de dururken LOD2’de silinmeli — LOD2 zaten uzak plan, orada yüz görünmüyor.
LOD0 / LOD1 slot haritası (finisher ve QTE dahil)
Buradaki iş, 19 yüz slotunun hangisinin hangi kademede yaşayacağına karar vermek.
Finisher / QTE ne değiştiriyor
Eskiden varsayım şuydu: yakın plan = sinematik, oynanış = uzak plan. Finisher ve QTE bunu bozdu — oynanışın ortasında kamera yüze yaklaşıyor. İki sonucu var:
- Yüz detayı LOD1’de tamamen atılamaz; LOD0’ın oynanış sırasında da devreye girebilmesi gerekiyor.
- Geçişin kendisi görünür hâle geliyor — aşağıdaki kısıt bu yüzden önemli.
Doğrulanmış teknik kısıt: skeletal mesh’te LOD geçişi yumuşatılamaz
Statik mesh’lerde LOD geçişini yumuşatan “dithered transition” özelliği var; motor kaynağında bu özellik yalnızca StaticMeshComponent’ta tanımlı, SkinnedMeshComponent’ta yok. Yani karakterde LOD1’den LOD0’a geçerken kapatılmış parçalar (kirpik, gözyaşı çizgisi, kornea) yumuşak geçişle değil, ANİDEN belirir.
Kamera finisher’da yüze yaklaşırken bu “pat diye beliren kirpik” olarak görünür. Çözüm aşağıda, uygulama adımlarının 3. ve 4. maddesinde.
LOD1’de kapatılacak slotlar
| Slot | Ne işe yarar | Doku payı |
|---|---|---|
| Std_Tearline_R | Gözyaşı çizgisi | 0.0 MB |
| Std_Tearline_L | Gözyaşı çizgisi | 0.0 MB |
| Std_Eye_Occlusion_R | Göz kapağı gölgesi | 0.0 MB |
| Std_Eye_Occlusion_L | Göz kapağı gölgesi | 0.0 MB |
| Std_Cornea_R | Kornea (kırılma katmanı) | 6.0 MB |
| Std_Cornea_L | Kornea (kırılma katmanı) | 6.0 MB |
| Std_Tongue | Dil | 5.0 MB |
| Std_Upper_Teeth | Üst dişler | 19.4 MB |
| Std_Lower_Teeth | Alt dişler | 19.4 MB |
Toplam 9 slot, 56 MB doku payı. Ayrıca en pahalı shader olan Tearline (1996 instruction) bu grupta — LOD1’de tamamen devre dışı kalıyor.
LOD1’de birleştirilecek slotlar
| Grup | Şu an | LOD1’de |
|---|---|---|
| Kaşlar | Brows_Hair_Transparency · Brows_Base_Transparency · Brows_Color_Transparency | tek slot |
| Kirpikler | Lash_Fine_Transparency · Lash_Thick_Transparency · Std_Eyelash | tek slot |
Sonuç
| Kademe | Slot | Ne zaman devrede |
|---|---|---|
| LOD0 | 24 | Sinematik · finisher · QTE · yakın plan |
| LOD1 | ~11 | Normal oynanış |
| LOD2 | 4-5 | Uzak plan |
Uygulama adımları
- LOD1’de kapatılacak section’ları işaretle. Unreal’de mesh’in LOD1 ayarlarında ilgili section ‘disabled’ yapılır. Model bozulmaz, o kademede çizilmez.
- Kaş ve kirpik slotlarını LOD1’de tek material’e yönlendir. LOD başına material haritası (LOD material map) ile yapılır; slotu silmeye gerek yok, LOD1’de aynı material’i göstermeleri yeterli.
- LOD1’in devreye gireceği ekran boyutunu ayarla. LOD seçimi ekran boyutuna göre çalışır. Eşiği, finisher kamerasının geleceği mesafeden DAHA UZAĞA koy — böylece finisher sırasında zaten LOD0’dasın ve geçiş hiç yaşanmaz.
- Finisher / QTE başlangıcında LOD0’ı zorla. Bir önceki adım tek başına yeterli olmazsa güvenlik kemeri: finisher başlarken SetForcedLOD(1) çağrılır — bu LOD0 demektir, numaralandırma bir kayıyor — bitince SetForcedLOD(0) ile otomatiğe bırakılır. Kamera hareket etmeden ÖNCE çağrılmalı ki geçiş görünmesin.
- Kontrol et. Finisher’ı oynat ve kirpik/gözyaşı çizgisinin bir anda belirip belirmediğine bak.
Bitti sayılır: Finisher kamerası yüze girerken hiçbir parça aniden belirmiyor.
Karar gerektiren tek nokta
Finisher kamerası yüze ne kadar yaklaşıyor? LOD1 eşiğini doğru koymak için bu mesafe gerekiyor. Finisher kamerası kurulduğunda ölçülüp buraya yazılmalı.
Shader ağırlığı
Pahalı shader kötü değildir; pahalı shader’ın büyük alan kaplaması kötüdür. Buradaki iş, pahalı olanların yalnızca yakın planda çalıştığından emin olmak.
- Material Editor’de Stats penceresini aç. Her material için instruction ve sampler sayısını orada görürsün.
- En pahalı shader’ların hangi kademede yaşadığını kontrol et. Tearline (1996) ve Eyelash (572) LOD1’de kapanıyor — bunlar hallolmuş oluyor.
- LOD1’de cilt için hafif seti kullan. Klasörde hazır duran LWHQ material instance’ları tam bunun için var; yeniden yazmaya gerek yok.
- Saydam (translucent) çizilen ne kaldıysa gözden geçir. Saydamlık en pahalı çizim türü. LOD1’de kalan tek saydam grup kaş/kirpik olmalı.
Bitti sayılır: LOD1’de 500 instruction üstü ve saydam çizilen slot sayısı en aza inmiş.
Doku ayarları
Grayscale maskeleri kanal paketine al
- Tek kanallı (grayscale) maskeleri tespit et. 26 adet, ~101 MB. Sıkıştırılmadan kaydediliyorlar.
- Üçünü bir dokunun R, G, B kanallarına yerleştir. Örneğin: R = pürüzlülük maskesi, G = metalik, B = ambient occlusion.
- Material’de ilgili kanalı oku. Tek doku örneklemesi üç maske verir; hem hafıza hem sampler tasarrufu.
Bitti sayılır: Grayscale doku sayısı belirgin biçimde düşmüş.
Doku gruplarını düzelt
- Karakter dokularının grubunu CHARACTER olarak ayarla. Şu an 125 doku WORLD grubunda; grup, streaming önceliğini belirliyor. Karakter dokuları dünya dokularıyla aynı öncelikte yarışmamalı.
Bitti sayılır: Karakter klasöründeki dokular CHARACTER gruplarında.
Dokuları kalıcı olarak “Cinematic” grubuna ALMA — o grup streaming tavanını kaldırır ve oynanıştaki streaming faydasını yok eder. Sinematik çözümü Sinematik ve yakın plan kalitesi bölümünde.
Material mimarisi (düşmanlar geldiğinde)
Sorduğumuz soru şuydu: her karakter aynı material setini mi kullanmalı? Cevap ne tek dev “her şeyi yapan” material, ne de karakter başına ayrı material. Doğru orta yol tür başına master.
Epic’in kendi Paragon projesinde tam olarak bu yapılmış: cilt, saç, göz, kumaş için küçük bir master seti kurulmuş, bütün kahramanlar bunların instance’ını kullanmış. Karakter farkı shader’dan değil, doku ve parametreden gelmiş.
İyi haber: Character Creator zaten bu yapıda çıktı veriyor. RL_ shader’ları master, mesh’e bağlı olanlar instance. Yani mimari şu an doğru — sıfırdan bir sistem kurmaya gerek yok.
- Düşmanları mevcut RL_ master’larının instance’ı olarak kur. En ucuz ve en hızlı yol. Fark doku ve parametreden gelir, yeni shader’dan değil.
- RL_ master’larının içini DOĞRUDAN düzenleme. Onu kullanan her karakter aynı anda etkilenir. Değişiklik instance seviyesinde.
- Ana karaktere ayrı bir shader ailesi açma. Ana karakter daha zengin bir instance alır — daha iyi haritalar, gerekiyorsa bir ek anahtar. Ayrı master değil.
- Gerçekten farklı bir shading model gerekiyorsa yeni master aç. Kürk, saydam yaratık, stilize efekt gibi. Düşman başına değil, TÜR başına.
- Master’a eklenen anahtar (static switch) sayısını az tut. Her anahtar runtime’da bedavadır ama derlenen shader varyantı sayısını kabaca ikiye katlar; bu da build süresi ve oyuna girerken takılma (shader stutter) demek. Anahtar sayısını az tutmak, master sayısını az tutmak kadar önemli.
Bitti sayılır: Yeni bir düşman eklendiğinde yeni bir master material açılmıyor.
Sinematik ve yakın plan kalitesi
LOD eklendikten sonra “sinematikte düşük kalite görünür mü” diye endişe etmeye gerek yok; motorun hazır mekanizmaları var. Üç ayrı durum var:
| Durum | Yöntem |
|---|---|
| Finisher / QTE (oynanış içi yakın plan) | LOD1 eşiğini uzağa koy + gerekirse başlangıçta SetForcedLOD(1) — bkz. LOD0 / LOD1 slot haritası |
| Oyun içi sinematik (Sequencer) | SetForcedLOD ile ilgili aktöre LOD0 dayat + PrestreamTextures ile dokuları birkaç saniye önceden yükle |
| Önceden render edilen sinematik (Movie Render Queue) | Game Overrides ayarı her şeyi kendisi yapar |
Movie Render Queue -> Game Overrides
bUseLODZero -> r.ForceLOD = 0, r.SkeletalMeshLODBias = -10
TextureStreaming -> Disabled (tüm dokular tam çözünürlükte)
bCinematicQualitySettings -> Cinematic kalite kademesi
Oyun içi sinematik (Sequencer) için:
SetForcedLOD(1) -> yalnızca o aktöre LOD0 dayat
PrestreamTextures() -> yakın plandan birkaç saniye önce dokuları yükle
- Önceden render edilen sinematikler için MRQ Game Overrides’ı aç. Varsayılan ayarları zaten istenen şeyi yapıyor.
- Oyun içi sinematikte ilgili aktöre LOD0’ı zorla. Global r.ForceLOD kullanma — o sahnedeki HER mesh’i etkiler.
- Yakın plandan birkaç saniye önce dokuları yükle. PrestreamTextures, dokuların tam çözünürlükte hazır olmasını sağlar; yoksa kamera girerken doku bulanıktan nete geçerken yakalanır.
Bitti sayılır: Yakın planda doku bulanıklığı veya düşük poligon görünmüyor.
Ayrı bir “sinematik mesh” hazırlamaya gerek yok. Sektörde böyle bir pratik var (“hero asset”) ama iki kat modelleme, iki kat UV, iki kat rig ve bir de geçiş mekanizması demek. Bizim durumumuzda LOD0 zaten tam kalite — onu zorlamak yeterli.
Ölçüm: yapılanı doğrulama
Rapordaki sayılar editörün içinden okundu. Değişiklik yaptıktan sonra aynı ölçümü tekrar çalıştırıp gerçekten düştüğünü görmek gerekiyor — “daha iyi görünüyor” bir doğrulama değil.
- Değişikliği yap ve asset’i kaydet. Ölçüm diskteki hâli değil, editördeki kayıtlı hâli okur.
- Ölçüm betiklerini çalıştır. Editör Python’uyla yazılmış üç betik; her biri yanına bir JSON yazar.
- Önceki JSON ile karşılaştır. Slot sayısı, doku sayısı ve MB toplamı düşmüş olmalı.
analyze_character_materials.py -> slot / shader / doku dökümü
analyze_character_lods.py -> LOD sayısı, streaming durumu
check_character_mesh_cost.py -> vertex, morph, disk boyutu
Bitti sayılır: Slot sayısı 24’ten düşmüş ve LOD sayısı 1’den büyük görünüyor.
Ölçmeden “iyileşti” deme.
Her adımdan sonra bu betikler tekrar çalıştırılır ve sayı karşılaştırılır. Ekranda daha iyi görünmesi doğrulama değildir; slot sayısı, LOD sayısı ve doku toplamı sayı olarak düşmüş olmalı.
Ana kontrol listesi
| # | İş | Nerede | Kim | Bağımlı olduğu | Kazanç |
|---|---|---|---|---|---|
| 1 | LOD1 ve LOD2 profillerini kur, öyle export et | Character Creator | Animatör | — | En büyük tek kazanç |
| 2 | LOD’ları içe aktar ve bağla | Unreal | Motor tarafı | 1 | — |
| 3 | LOD1’de 9 slotu kapat, kaş/kirpiği birleştir | Unreal | Motor tarafı | 2 | 24 → ~11 çizim, ~107 MB |
| 4 | LOD1 ekran boyutu eşiğini finisher mesafesine göre ayarla | Unreal | Motor tarafı | 3 + finisher kamerası | Geçiş görünmez |
| 5 | Finisher / QTE’de LOD0 zorlamasını bağla | Unreal | Motor tarafı | 4 | Güvenlik kemeri |
| 6 | Grayscale maskeleri kanal paketine al | CC / doku | Animatör | — | ~67 MB |
| 7 | Doku gruplarını CHARACTER yap | Unreal | Motor tarafı | — | Doğru streaming önceliği |
| 8 | LOD1 için LWHQ material setini bağla | Unreal | Motor tarafı | 2 | Hazır, yeniden yazılmayacak |
| 9 | Sinematik kalite kurulumu | Unreal | Motor tarafı | 2 | Yakın plan garantisi |
| 10 | Ölçümü tekrar çalıştır, düşüşü doğrula | Unreal | Motor tarafı | 3-8 | Kanıt |
- madde her şeyin önkoşulu. 4. ve 5. maddeler finisher kamerası kurulmadan tamamlanamaz — o yüzden finisher kamerası kurulunca haber verilmeli.
Neyin kanıtı var, neyin yok
Buradaki iddiaların hepsi aynı ağırlıkta değil. Ayrımı açıkça yazıyorum:
| İddia | Dayanağı |
|---|---|
| Yukarıdaki bütün sayılar (slot, doku, MB, morph, vertex) | Editörün içinden doğrudan ölçüldü |
| LOD başına farklı material ve section kapatma mümkün | Motor kaynak kodundan doğrulandı |
| Skeletal mesh’te dithered LOD geçişi yok; LOD seçimi ekran boyutuna göre; SetForcedLOD’un bir kayması | Motor kaynak kodundan doğrulandı |
| Sampler sınırı 16 | Motor kaynak kodundan doğrulandı |
| Static switch varyant sayısını ikiye katlar | Epic dokümanı |
| Sinematik zorlama komutları (ForceLOD, Prestream, MRQ) | Motor kaynak kodundan doğrulandı |
| CC’nin InstaLOD / Character Scalability özellikleri | Reallusion’ın kendi dokümanı |
| Tearline silinip geri eklenince bozuluyor | Reallusion’ın kendi hata kaydı |
| Tür başına master (Paragon örneği) | Stüdyo anlatımı |
| “Shader şu kadar instruction’ı geçmemeli” gibi bir sayı | Böyle resmî bir sayı YOK — internette görülen rakamlar kişisel görüş |
| Ana karakterin daha pahalı material alması normaldir | Yaygın pratik; tek bir resmî kaynağa dayanmıyor |
| Finisher kamerasının yaklaşma mesafesi | Henüz bilinmiyor — ölçülünce LOD1 eşiği netleşecek |
| Rev | Tarih | Çizen | Değişiklik |
|---|---|---|---|
| R-007 | Alparslan | İlk kayıt |