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

Oyununu bir patatoda çalıştırmak: düşük donanımlı PC'ler ve Steam Deck için ortamları optimize etmek

Sanatını bağırsaklamadan düşük bir kare bütçesini tutturmak için pratik bir el kitabı: kare süresi gerçekte nereye gidiyor, overdraw ve yeşillik, çizim çağrıları ve instancing, LOD'lar ve cull mesafeleri, ve gerçek gerilemeleri bulmak için sabit kamera yöntemi.

Slow tropical river between dense green banks, with clouds mirrored on the surface

Kısaca: oyuncuların büyük bir dilimi mütevazı donanımda (dizüstüler, Steam Deck gibi el konsolları, eski GPU'lar) ve yalnızca üst seviye bir sistemde çalışan bir ortam onları dışarıda bırakır. İyi haber: ortam performansının çoğu birkaç öngörülebilir yerde kaybolur (overdraw, çizim çağrıları, yoğun yeşillik, aşırı büyük dokular) ve birkaç disiplinli alışkanlıkla geri kazanılır. Bu, sanatını bağırsaklamadan düşük bir kare bütçesini tutturmak için pratik bir el kitabı, artı gerilemeleri gemiye binmeden yakalamak için sabit kamera yöntemi.

Örtüşen ağaçlar ve çalılıkla dolu yoğun bir orman Bu, çalıştırılması en pahalı sahne türüdür: şeffaf yaprak katmanları, binlerce örnek, ağır overdraw. Aynı zamanda, kare süresinin nereye gittiğini bildiğinde en büyük, en kolay kazanımların yaşadığı yerdir.

Önce bir bütçe belirle, milisaniye cinsinden

En zayıf desteklediğin donanımda bir hedef kare süresi seç (60 fps için 16,6 ms, 30 için 33,3 ms) ve onu katı bir sınır olarak ele al. "Sonra optimize et" demek "sonra yeniden inşa et" demektir; önden bütçelemek çok daha ucuzdur.

Sayısız optimizasyon sadece histir. Zemin donanımında (Steam Deck, orta bir dizüstü, minimum specin her neyse) hedeflediğin kareyi belirle ve onu milisaniyeye çevir, çünkü milisaniyeler toplanır ve yüzdeler yalan söyler. Sonra her sahneyi inşa ederken buna tut, sonda değil. Düşük donanımda pürüzsüz gemiye bindiren ekipler daha sert optimize etmez; sadece bir sahnenin bütçeyi ilk etapta patlatmasına asla izin vermezler, ki bu, sanat bitip her şey ona bağlı olduktan sonra performansı geri tırmalamanın bir kesridir.

Sürenin nereye gittiğini bil

Ortam kare süresi genellikle overdraw (şeffaf yeşillik), çok fazla çizim çağrısı (batch'lenmemiş nesneler), aşırı büyük dokular (bellek bant genişliği) ve pahalı aydınlatma/gölgeler tarafından yenir. Kör kör optimize etmeden önce SENİN darboğazını bulmak için profil çıkar.

Optimizasyonları tahmin etmek günler harcatır. Bir profilleyici aç, CPU-bound mısın (genellikle çizim çağrıları) yoksa GPU-bound mısın (genellikle overdraw, gölgeleme veya bant genişliği) bul, ve gerçek darboğaza saldır. Yine de, ortamlar öngörülebilir şekillerde başarısız olur ve neredeyse her zaman şunlardan biridir: katmanlı şeffaf yeşillikten overdraw; binlerce örneklenmemiş nesneden çizim çağrıları; aşırı büyük ya da çok fazla dokudan doku belleği/bant genişliği; ve çok fazla dinamik ışık ya da yüksek çözünürlüklü gölge haritasından aydınlatma/gölge maliyeti. Bu el kitabının kalanı bunları olağan etki sırasıyla işler.

Yeşillik ve overdraw: her zamanki kötü adam

Şeffaf yeşillik kartları örtüşür ve aynı pikselleri defalarca yeniden gölgeler: bu overdraw'dur ve düşük donanımın bir numaralı katilidir. Yaprak kartı örtüşmesini azalt, agresif LOD'lar kullan, ve uzak yeşilliği sert cull et.

Yoğun bitki örtüsü, düşük donanım kare bütçelerinin çoğunun öldüğü yerdir, çünkü her yarı şeffaf yaprak kartı GPU'yu, sonra üzerine tekrar çizeceği pikselleri gölgelemeye zorlar, kalın bir tepe örtüsünde bazen piksel başına on ve fazlası kez. Düzeltmeler: daha az boşa harcanan şeffaf alanla daha sıkı yaprak kartları kullan, yeşillik geri çekildikçe hızla daha ucuz LOD'lara düş, ve uzak çim ve çalıların basitçe çizmeyi bıraksın diye sert cull mesafeleri ayarla. Bir el konsolunda, "ufka kadar çim" ile "makul bir mesafede cull edilmiş çim" arasındaki fark, 25 ile 40 fps arasındaki tüm fark olabilir. GPU batch'leyebilsin diye yeşilliği yerel örneklere bake et, ve motorun instancing'inin ağır işi yapmasına izin ver.

Çizim çağrıları ve instancing

Ayrı ayrı gönderilen her benzersiz nesne bir çizim çağrısıdır ve binlercesi CPU'yu tıkar. Tekrarlanan mesh'leri örnekle ki yüzlerce kopya bir çağrıya mal olsun; mantıklı olan yerde statik dağınıklığı birleştir.

CPU-bound isen, çizim çağrıları genellikle neden. Motordan render etmesini istediğin her ayrı şey yük taşır ve bin ayrı kaya ve çalıyla elle yerleştirilmiş bir sahne, CPU'yu gönderim maliyetinde boğar. Instancing çaredir: örnek olarak çizilen tekrarlanan mesh'ler yüzlerce kopyayı tek bir çağrıya çökertir, ki bu tam olarak yerel motor örneklerine bake eden saçma araçlarının performans için önemli olmasının nedenidir: bin bitki gibi görünen saçım, bir avuç gibi mal olur. Instancing'in geçerli olmadığı yerde, küçük statik dağınıklığı birleşik mesh'lere birleştirmek de çağrı sayısını keser. Bu, Numivo'nunki gibi bir iş akışının (yoğunluğu boya, sonra düz örneklenmiş mesh'lere bake et) zayıf donanımda doğrudan karşılığını verdiği bir yerdir, çünkü çıktı, GPU'nun istediği ucuz şeydir.

Berrak bir gökyüzü altında sakin, basit bir göl, render etmesi ucuz Her sahnenin maksimum yoğun olması gerekmez. Sessiz, açık alanlar neredeyse hiçbir şeye mal olmaz ve hem donanıma hem de oyuncuya bir dinlenme verir: yoğunluğunu ritme bağlamak başlı başına bir optimizasyondur.

LOD'lar, cull mesafeleri ve doku boyutları

Uzak kopyalar ucuz olsun diye her önemli mesh'e LOD ver, ekranda-minik nesneler çizmeyi bıraksın diye cull mesafeleri ayarla, ve doku çözünürlüğünü kameranın mesafede çözdüğü şeyle sınırla. Bu üçü az çabayla çok geri kazanır.

Üç gösterişsiz alışkanlık kalan bütçenin çoğunu taşır. LOD'lar: uzak mesh'ler daha düşük poligonlu sürümlere geçmeli, çünkü 20 pikselik bir ağaçta tam detay boşa gider. Cull mesafeleri: ekranda fark edilemeyecek kadar küçük olan her şey tamamen render etmeyi bırakmalı (küçük proplar, çakıllar, ince çim), nesne türüne göre ayarlanmış. Doku boyutları: çözünürlüğü oyuncunun mesafesinde gerçekten çözülebilir olanla sınırla (teksel yoğunluğu mantığına bak, uzak şeyler çok daha az teksele ihtiyaç duyar), çünkü aşırı büyük dokular, düşük donanımlı GPU'ların ayıramayacağı bellek bant genişliğini yakar. Doğru ayarlandığında bunların hiçbiri görünüşe zarar vermez; sadece kimsenin görmediği detay için ödeme yapmanı durdururlar.

Gerilemeleri sabit kameralarla bul

Birkaç "bütçe kamerası" tanımla (en kötü manzaran, en yoğun savaş alanı, en meşgul iç mekân) ve her build'de kare sürelerini kontrol et. Rastgele uçuşlar gerilemeleri gizler; her seferinde aynı acımasız görüntüler onları açığa çıkarır.

İçerik eklendikçe performans sessizce çürür ve seviyeyi gelişigüzel dolaşarak bunu yakalayamazsın. Bunun yerine, bir avuç en kötü görüntünü sabitle (yoğun orman manzarası, kalabalık pazar, efekt yüklü dövüş) ve tam olarak onları, her build'de, bütçeye karşı ölç. Bir sayı kırmızıya döndüğünde, yakın bir değişikliğin buna neden olduğunu ve kabaca nerede olduğunu bilirsin. Bu, sonda bir performans krizi keşfeden bir ekip ile 2 ms'lik bir gerilemeyi ortaya çıktığı gün düzelten bir ekip arasındaki farktır. Düşük donanım hedeflerinde, o kameralardan birini yalnızca bir editör tahmininde değil, gerçek Steam Deck ya da minimum spec makinede çalıştır.

Çalmaya değer saha sayıları

  • Kare bütçeleri: 16,6 ms (60 fps) / 33,3 ms (30 fps), zemin donanımında ayarla
  • Düşük donanımın olağan katili: yeşillik overdraw'ı, çözümü daha sıkı kartlar, hızlı LOD'lar, sert cull
  • Tekrarlanan mesh'ler → örnekler: bir çizim çağrısı için yüzlerce kopya
  • Doku boyutunu kameranın çözebileceği detayla sınırla, uzak çok daha az teksel gerektirir
  • Gerilemeleri sabit bütçe kameralarıyla yakala, her build'de ölçülür

Mini-SSS

İyi görünen ile düşük donanım arasında seçim yapmalı mıyım? Sandığından az. Düşük donanım maliyetinin çoğu israftır (overdraw, batch'lenmemiş çağrılar, aşırı büyük dokular), görünür kalite değil. İsrafı kes ve sanat hayatta kalır; zayıf donanımdaki oyuncular, ödediğin ama göremedikleri detayı nadiren özler.

Dinamik aydınlatma Steam Deck'te yasak mı? Yasak değil, ama bütçelenmiş. Dinamik ışıkların ve gölge atanların sayısını sınırla, sahnenin statik olduğu yerde bake edilmiş aydınlatmaya yaslan, ve dinamik maliyeti önemli olan yere ayır. Bu bir bütçe kalemidir, bir yasak değil.

Bir el konsolunda en çok hangi tek değişiklik yardımcı olur? Genellikle yeşilliği evcilleştirmek: daha sıkı yaprak kartları, agresif LOD'lar ve çim ve çalılarda sert cull mesafeleri. Overdraw en yaygın el konsolu darboğazıdır ve bitki örtüsü overdraw'ın yaşadığı yerdir.

Hedef donanımda ne kadar erken test etmeliyim? İlk vertical slice'tan. Güçlü bir geliştirici makinesindeki bir editör tahmini, tam olarak el konsolunun yaşayacağı sorunları gizler. Gerçek minimum spec cihazda bir build'i erken al ve döngüde tut.

Bir patatoda çalışmak oyununu çirkinleştirmekle ilgili değil: oyuncuların göremediği detay için ödeme yapmamakla ilgili. Milisaniye cinsinden bütçele, overdraw'ı öldür, tekrarları örnekle, görünmezi cull et, ve her build'de en kötü kameralarını izle, böylece ortamın harika görünecek ve üst seviye bir sistemde olmayan devasa kitle için çalışacak.