CPU ve GPU optimizasyonuyla ilgili ipuçları

Bu belgede, CPU ve GPU darboğazlarını belirlemek ve çözmek için araçlar kullanarak oyun performansını nasıl optimize edeceğiniz gösterilmektedir.

CPU optimizasyonu

Analiz, oyunun CPU'ya bağlı olduğunu gösteriyorsa daha ayrıntılı bir inceleme yapılması gerekir. Bu işlem için darboğazlara neden olan ve FPS'yi düşüren belirli iş parçacıklarının veya API'lerin tanımlanması gerekir.

CPU optimizasyonu için genellikle evrensel bir çözüm etkili olmaz. Bunun yerine, oyuna veya sahneye göre en çok kaynak gerektiren iş yükünü belirlemeniz ve ardından ilgili mantığı ve işlevleri optimize etmeniz gerekir.

Oyun motoru zamanlama izleme araçları

Bu analizde aşağıdaki araçlardan yararlanabilirsiniz:

Unreal Engine analizleri

Unreal Engine projelerinde Unreal Insight Tool, bir kareyi oluşturan tek tek iş parçacıklarının zamanlama izleme bilgilerinin analizini kolaylaştırır.

Örnek olarak, GameThread genellikle CPU süresinin en büyük bölümünü kullanır ve bu durum öncelikle Tick Time'dan kaynaklanır. Ayrıca, Tick Time'ın önemli bir kısmı FActorComponentTickFunction ile ilişkili görevler tarafından tüketilir.

FActorComponentTick değerini optimize etmek için hesaplamaları hariç tutmak ve kamera görüş alanının dışında konumlandırılmış karakterler ve nesneler için kırpma uygulamak zorunludur. Ayrıca, ayrıntı düzeyine (LOD) dayalı animasyonlardan yararlanmak performansı daha da artırabilir.

GameThread, RenderThread ve RHIThread yürütme sürelerini gösteren Unreal Insight izleme zaman çizelgesi
GameThread, RenderThread ve RHIThread ile Unreal Insight izi (büyütmek için tıklayın).

Unity Profiler (Unity)

Unity Profiler kullanılarak yapılan analiz, ana iş parçacığının 45 ms'den fazla zaman aldığını ortaya koyuyor.PostLateUpdate.FinishFrameRendering ise 16, 23 ms'lik süreyle en çok zaman alan işlem. Bu süre içinde Inl_RenderCameraStack'in birden fazla kez çağrıldığı görülüyor. Etkinleştirilen kameraların gerekliliğini belirlemeniz ve bunları buna göre optimize etmeniz önerilir.

Unity Profiler zaman çizelgesinde, ana iş parçacığının Gfx.WaitForPresentOnGfxThread'i beklediği gösteriliyor.
Unity Profiler için GPU sınırlı örneği (büyütmek için tıklayın).

Sistem düzeyinde profil oluşturma araçları

Aşağıdaki profilleme araçlarını kullanın:

Perfetto

Perfetto izini kullanarak Android destekli bir cihazdaki her iş parçacığının CPU çekirdeği atamalarını ve yürütme ayrıntılarını belirleyebilirsiniz. Bu sayede, iş parçacığı yürütme verilerini analiz ederek performans darboğazlarını belirleyebilirsiniz.

CPU ek yükü durumu

İzleme, GameThread ve RenderThread'deki iş yükünün, RHI Thread'in QueuePresent'inde gecikmelere neden olduğunu ve VSync'e bağlı olarak CPU sınırlı bir senaryoya yol açtığını gösteriyor.

GameThread, RenderThread ve RHIThread için yürütme sürelerini gösteren Perfetto izi
CPU yürütme ayrıntılarını içeren Perfetto izleri (büyütmek için tıklayın).

GPU ek yükü durumu

İzleme, GPU tamamlama süresinin 25 ms'yi aştığını gösteriyor. Bu da GPU'ya bağlı bir senaryo olduğunu gösterir.

GPU tamamlanmasının beklenmesini gösteren Perfetto izi
GPU ek yükü ayrıntılarını içeren Perfetto izleri (büyütmek için tıklayın).

Simpleperf

En yüksek CPU kullanımına sahip işlevleri belirlemek için simpleperf kullanılabilir. En iyi sonuçları elde etmek için bu işlevleri, en yüksek kullanıma sahip olanları önceliklendirecek ve ele alacak şekilde sıralamanız önerilir.

En yüksek CPU kullanımına sahip işlevleri gösteren Simpleperf çıkışı
Simpleperf CPU profili oluşturma: İşlev çağrısı hiyerarşisini ve kaynak kullanımını analiz etme (büyütmek için tıklayın).

Simpleperf, en çok CPU süresini kullanan işlevlerle ilgili verileri incelemenize yardımcı olur. CPU kullanımını optimize etmek için en çok CPU kullanan işlevlerle başlayın. Bu örnekte, ActorComponentTickFunctions içindeki animasyonla ilişkili olan USkeletalMeshComponent en fazla CPU'yu kullanıyor.

GPU Optimizasyonu

Analiz, oyunun GPU'ya bağlı olduğunu gösteriyorsa daha ayrıntılı bir inceleme yapılması gerekir. Bu işlem için GPU optimizasyonu ve analiziyle ilgili çeşitli araç ve tekniklerin kullanılması gerekir.

GPU'yu optimize etmek için her sahnenin oluşturma ardışık düzenini ve çizim çağrılarını analiz etmek üzere bir çerçeve hata ayıklayıcısı kullanın. Ayrıca, gereksiz işlemleri veya optimize edilecek alanları belirlemek için GPU mimarisini ve ardışık düzen davranışını iyice anlamanız gerekir.

Aşağıdaki bölümlerde GPU optimizasyonu için yöntemler ve araçlar açıklanmaktadır.

Gereksiz RenderPass'leri ortadan kaldırın

Oluşturma performansını artırmak ve GPU iş yükünü azaltmak için gereksiz oluşturma geçişlerini ortadan kaldırın. Bunlar, çizim çağrıları olmayan veya çıkışı son karede kullanılmayan tüm oluşturma geçişlerini içerir.

Oluşturma işlem hattını analiz etmek ve optimizasyon fırsatlarını belirlemek için RenderDoc gibi bir GPU hata ayıklayıcısı kullanın.

  1. Çizim çağrısı yok: Oluşturma geçişinin herhangi bir çizim çağrısı içerip içermediğini kontrol edin. Çizim çağrıları yoksa kartı kaldırın.

  2. Kullanılmayan Çıkış: Sonraki geçişlerin, oluşturma geçişi çıkışlarına (ör. renk veya derinlik) erişip erişmediğini ya da bunları gösterip göstermediğini kontrol edin. Aksi takdirde kartı kaldırın.

  3. Birleştirilebilir kartlar: Birleştirebileceğiniz kartları belirleyin:

    • Aynı arabellek veya ekler
    • Uyumlu yük veya mağaza işlemleri
    • Arada bağımlılık engeli olmaması
Vulkan oluşturma geçişlerini ve çizim çağrılarını gösteren RenderDoc etkinlik tarayıcısı
RenderDoc'taki RenderPass ve GPU komut sırası (büyütmek için tıklayın).

Yükleme veya depolama işlemlerini en aza indirme

Yükleme veya depolama işlemleri çok fazla bellek kullandığından kaynak yoğun işlemlerdendir. Gereksiz yükleme/depolama işlemlerini en aza indirin. Bu işlemleri yalnızca RenderPass içindeki ekler gerektiğinde yapın. Aksi takdirde, ek yükü azaltmak için bunları Clear veya Don't care işlemleriyle değiştirin.

Nasıl optimize edilir?

Oluşturma işlem hattını analiz etmek ve aşağıdaki optimizasyon fırsatlarını belirlemek için RenderDoc gibi bir GPU hata ayıklayıcısı kullanın:

  1. Yükleme: Bir oluşturma geçişi eki, önceki bir geçiş veya ekteki verileri kullanmıyorsa yükleme işlemi gereksizdir. Bu gibi durumlarda, Don't care veya Clear kullanmak ek yükü azaltabilir.

  2. Store: Geçerli oluşturma geçişinden sonra bir oluşturma geçişi eki kullanılmazsa depolama işlemi gereksizdir. Bu gibi durumlarda Don't care veya Clear kullanın.

  3. Değiştir: Son kareyi etkilemeden mevcut yükleme veya depolama ayarlarının Clear ya da Don't Care ile değiştirilip değiştirilemeyeceğini belirleyin.

Görüntü düzenini ve oluşturma geçişlerini analiz eden RenderDoc etkinlik tarayıcısı ve kaynak inceleyici
RenderDoc oluşturma ardışık düzeni analizi (büyütmek için tıklayın).

Early-Z'yi etkinleştirmek için silme işleminden kaçının

Early-Z, mobil platformlarda performansı artırır. Ancak, bir gölgelendiricideki discard talimatı, Early-Z'yi otomatik olarak devre dışı bırakır. discard Talimat gerekli değilse kaldırın.

Erken Z ivmesi

Bu optimizasyon, parça gölgelendirici işlemlerini önemli ölçüde azaltır ve GPU performansını artırır.

Early-Z Derinlik ve şablon testi

Erken Z etkinleştirildiğinde ve devre dışı bırakıldığında CPU ile GPU performans metriklerini karşılaştıran tablo
Erken Z hızlandırmanın performans üzerindeki etkisi (büyütmek için tıklayın).

Nasıl optimize edilir?

Oluşturma işlem hattını analiz etmek ve aşağıdaki optimizasyon fırsatlarını belirlemek için RenderDoc gibi bir GPU hata ayıklayıcısı kullanın:

  1. Parça gölgelendiricilerde discard kullanımı: discard anahtar kelimesi, parçanın görünürlüğü önceden bilinmediğinden GPU'nun erken derinlik testleri yapmasını engeller.

  2. gl_FragDepth değiştirme: gl_FragDepth değerinin dinamik olarak değiştirilmesi, parçanın derinliğini değiştirir. Bu durum, parça işlenmeden önce son derinlik bilinmediğinden Early-Z optimizasyonunu devre dışı bırakır.

  3. Alfa-kapsama etkinleştirildi: Alfa-kapsama etkinleştirildiğinde (genellikle MSAA oluşturmada kullanılır) parça kapsamı alfa değerlerine bağlıdır. Bu durum, derinlik testini geciktirebilir ve Early-Z'yi devre dışı bırakabilir.

Atma gölgelendirici anahtar kelimesi içeren ve içermeyen piksel başına parça karşılaştırması
Analiz için RenderDoc GPU hata ayıklayıcısı (büyütmek için tıklayın).

Doku biçimini optimize etme

En uygun doku biçiminin seçilmesi bellek tüketimini azaltır, bant genişliği verimliliğini artırır ve oluşturma performansını iyileştirir. Aşırı yüksek hassasiyetli formatlar kullanmak, görsel avantaj sağlamadan GPU kaynaklarını boşa harcayabilir.

Nasıl optimize edilir?

Oluşturma işlem hattını analiz etmek ve aşağıdaki optimizasyon fırsatlarını belirlemek için RenderDoc gibi bir GPU hata ayıklayıcısı kullanın:

  1. Derinlik-şablon arabellekleri için D32S8 yerine D24S8 kullanın: Derinlik-şablon arabellekleri için D24S8 kullanmak, çoğu uygulamada görsel kalitede fark edilebilir bir değişiklik olmaksızın veya çok az bir değişiklikle D32S8'ye kıyasla bellek tüketimini% 20 azaltır.
  2. Renk dokuları için ASTC sıkıştırmayı kullanın: ASTC sıkıştırma, yüksek görsel kaliteyi korurken doku bellek kullanımını önemli ölçüde (sıkıştırılmamış biçimlere kıyasla 8 kata kadar) azaltır.
  3. Tam kayan nokta yerine yarım kayan nokta biçimleri kullanın: Bellek bant genişliğini ve depolama alanı tüketimini azaltmak için R16F veya RG16F kullanın. Bu biçimler, işleme sonrası arabellekler için uygundur.

Geometri karmaşıklığını optimize etme

Geometrik karmaşıklığı en aza indirmek, özellikle GPU özellikleri sınırlı olan mobil cihazlarda oluşturma performansını artırır. Bu işlemde, köşe ve üçgen sayısını azaltma, çizim çağrılarını azaltmak için nesneleri birleştirme ve oluşturulmamış veya gereksiz geometrileri ortadan kaldırma yer alır. Örgü basitleştirme, ayrıntı düzeyi (LOD) ve görüş alanı veya tıkanma temizleme gibi teknikler, GPU iş yükünü önemli ölçüde azaltabilir ve kare hızlarını artırabilir.

Nasıl optimize edilir?

Geometriyle ilgili performans sorunlarını belirlemek için RenderDoc, Android GPU Inspector veya diğer performans analiz araçları gibi profil oluşturma araçlarını ve GPU hata ayıklayıcılarını kullanın.

  1. Üçgen sayısını azaltma: Özellikle küçük veya uzak nesneler için çokgen kullanımını en aza indirin.

  2. Ayrıntı Düzeyini (LOD) kullanın: Kameranın mesafesine bağlı olarak daha basit ağlar otomatik olarak kullanılır.

  3. Küçük Örgüleri Birleştirme: Çizim çağrılarını ve CPU ek yükünü azaltmak için statik nesneleri birleştirin.

  4. Görüş alanı ve tıkanma eleme: Görüş alanı dışında olan veya diğer öğeler tarafından gizlenen nesnelerin oluşturulmasından kaçının.

Gereksiz ekleri kaldırma

Oluşturma geçişi ekleri (ör. renk, derinlik, şablon) kullanılmasalar bile bellek bant genişliğini ve GPU kaynaklarını tüketir. Gereksiz veya yedekli eklerin kaldırılması, özellikle mobil platformlarda performansı artırır ve güç tüketimini azaltır.

Nasıl optimize edilir?

Geometriyle ilgili performans sorunlarını belirlemek için RenderDoc, Android GPU Inspector gibi profil oluşturma araçlarını ve GPU hata ayıklayıcılarını ya da diğer performans analiz araçlarını kullanın.

  1. Gerçek kullanımı kontrol edin: Eke yazan veya ekten okuyan herhangi bir çizim çağrısı ya da gölgelendirici var mı?
  2. Çerçeve çıkışını analiz edin: Eklerin son resme katkıda bulunup bulunmadığını belirlemek için RenderDoc veya benzer yardımcı programları kullanın.
  3. Geçici veya sahte ekleri kullanın: Kalıcı depolama alanı gerektirmeyen geçici veriler için geçici ekler veya "önemsemiyorum" depolama işlemi kullanılmalıdır.

Gölgeleyici hassasiyetini optimize etme

Gölgelendiricilerde aşırı yüksek hassasiyet (örneğin, mediump veya lowp yerine highp) kullanmak, özellikle mobil GPU'larda GPU iş yükünü, güç tüketimini ve kayıt basıncını artırır. Değişkenler (ör. konumlar, renkler, UV'ler) için yeterli olan en düşük hassasiyeti kullanarak performansı gözle görülür bir görsel etki olmadan iyileştirebilirsiniz.

Orta ve yüksek gölgelendirici hassasiyeti kullanıldığında CPU ve GPU performans metriklerini karşılaştıran tablo
Gölgelendirici hassasiyetinin performans üzerindeki etkisi (büyütmek için tıklayın).

Nasıl optimize edilir?

Geometriyle ilgili performans sorunlarını belirlemek için RenderDoc, Android GPU Inspector gibi profil oluşturma araçlarını ve GPU hata ayıklayıcılarını ya da diğer performans analiz araçlarını kullanın.

  1. Gölgeleyici kodunu inceleyin: Gölgeleyici değişkenlerini değerlendirin ve yüksek hassasiyetin yalnızca gerektiğinde (ör. derinlik veya ekran alanı hesaplamaları için) kullanıldığını doğrulayın. Yüksek hassasiyet gerektirmeyen renkler, UV koordinatları veya değerler için orta ya da düşük hassasiyet kullanın.

  2. GPU hata ayıklayıcılarını kullanın: RenderDoc veya mobil GPU profilleri (ör. AGI, Mali/GPU Inspector) gibi teşhis araçları, hassasiyet sorunlarıyla ilişkili yüksek kayıt kullanımı veya gölgelendirici duraklamalarını tanımlar.

Mali Varying Usage profiler, mediump kullanan gölgelendirici koduyla birlikte 16 bitlik enterpolasyonu gösteriyor
Profillendirme araçları ve GPU hata ayıklayıcılarına örnek (büyütmek için tıklayın).

Arka yüzey temizlemeyi etkinleştirme

Kameraya dönük olmayan üçgenlerin (arka yüzler) oluşturulması genellikle katı nesneler için gereksizdir.

Nasıl optimize edilir?

VK_CULL_MODE_NONE kullanımı, GPU'nun hem ön hem de arka yüzleri oluşturmaya zorlanmasına neden olduğundan performansı olumsuz etkileyebilir. Bu durum, oluşturma iş yükünü artırır.

vkCmdSetCullMode'un VK_CULL_MODE_NONE olarak ayarlandığını gösteren Vulkan komut günlüğü
Arka yüzey temizleme ile hata ayıklama günlükleri (büyütmek için tıklayın).

Kullanıcı arayüzü sahnelerinde fazla çizimi en aza indirme

Oluşturma performansını artırmak ve GPU iş yükünü azaltmak için özellikle kullanıcı arayüzü sahnelerinde gereksiz çizim çağrılarını ve oluşturma geçişlerini ortadan kaldırın. Örneğin, kullanıcı arayüzünün ekrana yerleştirilmesinden önce tüm dünyanın oluşturulduğu bir kullanıcı arayüzü sahnesinde, dünyanın oluşturulması gereksiz hale gelir.

Nasıl optimize edilir?

Oluşturma işlem hattını analiz etmek ve aşağıdaki optimizasyon fırsatlarını belirlemek için RenderDoc gibi bir GPU hata ayıklayıcısı kullanın:

  1. Gereksiz fazla çizim olmadığını doğrulayın. Kullanıcı arayüzü bağlamlarında, ekranın tamamının oluşturulabileceği durumlarda, önceki oluşturma geçişlerinin gereksiz yere fazla çizilmediğini doğrulayın.
  2. Performansı optimize etmek için derinlik testini ve eleme özelliğini etkinleştirin.
  3. Ön taraftan arka tarafa doğru oluşturma sırasını kullanmayı deneyin.
Gereksiz bir fazla çizim oluşturma geçişini tanımlayan RenderDoc etkinlik tarayıcısı ve doku görüntüleyici
Gereksiz çizim çağrılarını ve oluşturma geçişlerini ortadan kaldırma örneği (büyütmek için tıklayın).