Grafik Pipeline'ını Etkili Şekilde Nasıl Debug Edersiniz?

Kerem Aydın·9 Temmuz 2026·⏱5 dk

GPU hata ayıklama, karelerin görsel analizi ile performans metriklerinin birleşimini gerektirir. Darboğazları (bottlenecks) bulmak için NVIDIA Nsight veya AMD Radeon GPU Profiler gibi profiler'lar kullanın; shader'lardaki artefaktları düzeltmek için ise RenderDoc veya PIX gibi kodun adım adım yürütülmesine olanak tanıyan interaktif debugger'ları tercih edin. Başarının anahtarı sorunu izole etmektir: önce bellek bant genişliği, hesaplama birimleri yoksa fill-rate (doldurma hızı) tarafından mı kısıtlandığınızı belirleyin, ardından shader kodlarını düzenlemeye başlayın.

İçindekiler

Araç seçimi: profiler'lar vs debugger'lar

Araç seti iki kategoriye ayrılır: hızı ölçenler ve doğruluğu kontrol edenler.

  1. Frame Capturers (Durum Debugger'ları): Bir kareyi "dondurmanıza", kaynakları (dokular, buffer'lar) incelemenize ve shader'ları adım adım çalıştırmanıza olanak tanır.

    • RenderDoc: Endüstri standardı, çapraz platformlu bir araçtır. Vulkan, DirectX 11/12 ve OpenGL'i destekler. Render mantığını kontrol etmek için idealdir.
    • PIX (Windows): DirectX 12 için en iyi seçimdir. Windows ile derin entegrasyon sağlar, bellek yığınlarını ve komut listelerini güçlü bir şekilde analiz eder.
    • Xcode Graphics Debugger: macOS/iOS (Metal) üzerinde geliştirme yaparken vazgeçilmezdir.
  2. Performance Profilers (Performans Analizörleri): Zamanlamaları, GPU bloklarının yükünü ve takılma (stalling) nedenlerini gösterir.

    • NVIDIA Nsight Graphics / Systems: GeForce mimarisine dair detaylı bilgiler sunar. Warp occupancy ve latency hiding değerlerini gösterir.
    • AMD Radeon GPU Profiler (RGP): RDNA donanım seviyesinde dalga (waves) ve talimatların görselleştirilmesini sağlar.
    • Intel GPA: Entegre grafikler ve optimizasyonun erken aşamaları için iyidir.

Görselin doğruluğunu kontrol etmek için RenderDoc ile başlayın. Eğer FPS düşükse, donanım sayaçlarına erişim sağladıkları için satıcıya özel profiler'lara (Nsight/RGP) geçiş yapın.

Profil oluşturma: performans darboğazlarını bulma

Profil oluşturma, "Neden yavaş?" sorusuna yanıt verir. Modern GPU, dar boyunun sadece hesaplama değil, aynı zamanda veri bekleme de olabileceği devasa paralel bir cihazdır.

Temel Darboğaz (Bottleneck) Türleri

  1. CPU-bound: İşlemci komutları (draw call'ları) oluşturmakta yetersiz kalır.

    • Belirtiler: Düşük GPU yükü, render iş parçacığında yüksek CPU süresi.
    • Çözüm: Instancing, çağrıları gruplama (batching), komut buffer'larının çok thread'li yazımının kullanılması.
  2. GPU Compute-bound: Shader'lar çok karmaşıktır, az sayıda thread paralel olarak çalışır.

    • Belirtiler: Yüksek pixel/vertex shader çalışma süresi, düşük occupancy.
    • Çözüm: Matematiğin basitleştirilmesi, thread başına register sayısının azaltılması, dallanmanın (branching) optimize edilmesi.
  3. Memory/Bandwidth-bound: Dokuların veya buffer'ların yavaş okunması/yazılması.

    • Belirtiler: Yüksek bellek veriyolu yükü, veri beklemesinden kaynaklanan takılmalar.
    • Çözüm: Doku sıkıştırma (BC/ASTC), mipmaps kullanımı, bellek erişiminin optimize edilmesi (compute shader'larda coalescing).
  4. Fill-rate/Latency bound: Piksel örtüşmesi (overdraw) veya senkronizasyon gecikmeleri.

    • Belirtiler: Çok sayıda yarı saydam nesne, karmaşık blending işlemleri.
    • Çözüm: Opak nesnelerin front-to-back sıralanması, erken Z-testi (Early-Z), overdraw'ın azaltılması.

Kare Analiz Süreci

  1. Yoğun bir sahnede kare yakalama işlemi yapın.
  2. Timeline'a bakın: hangi aşama en fazla zaman alıyor?
  3. Heatmap'leri inceleyin: overdraw veya piksel çalışma sürelerinin görselleştirilmesi.
  4. State Binding'i kontrol edin: tek bir kare içinde gereksiz bağlam değişiklikleri (pipeline state changes) var mı?

Shader debugging: artefaktlardan düzeltmeye

Görsel yanlış göründüğünde (siyah poligonlar, titreme, yanlış aydınlatma), adım adım debugging gerekir.

"Renk Kodlama" Yöntemi (Debug Colors)

Eğer interaktif bir debugger mevcut değilse, ara verileri doğrudan frame buffer'a yazdırın:

  • Normalleri RGB olarak yazdırın (output.color = float4(normal * 0.5 + 0.5, 1)). Kameraya bakan yüzeylerde mavi renk baskın olmalıdır.
  • UV koordinatlarını yazdırın. Siyahtan beyaza gradyan, doku gerilmelerini gösterecektir.
  • Derinliği (Depth) yazdırın. Z-fighting veya yanlış projeksiyon sorunlarını bulmaya yardımcı olur.

RenderDoc/PIX'te Adım Adım Debugging

  1. Piksel Seçimi: Ekranın sorunlu alanına tıklayın.
  2. History View: Bu pikseli etkileyen draw call zincirini takip edin.
  3. Shader Debugging:
    • Seçilen piksel için shader yürütmesini başlatın.
    • HLSL/GLSL kodu içinde breakpoint'ler kullanın.
    • Değişken değerlerini gerçek zamanlı olarak izleyin. NaN (Not a Number) ve Inf değerlerine dikkat edin; bunlar genellikle sıfıra bölme veya negatif sayının karekökünü alma işlemlerinden kaynaklanır.

Derleyici optimizasyonlarına dikkat. Release build'lerde derleyici kullanılmayan değişkenleri atabilir veya talimatların yerini değiştirebilir. Shader debugging için her zaman agresif optimizasyonun kapalı olduğu konfigürasyonu veya sürücünün özel debug flag'lerini kullanın.

Tipik Shader Sorunları

  • Hatalı matrisler: Nesne sonsuza uçuyor veya eziliyor. Matris çarpım sırasını kontrol edin (Row-major vs Column-major).
  • Normalizasyon sorunları: İnterpolasyondan sonra vektörler (normaller, teğetler) birim uzunluğunu kaybedebilir. Aydınlatmada kullanmadan önce fragment shader'da her zaman normalize() yapın.
  • Precision hataları: Mobil cihazlarda (OpenGL ES/Metal) pozisyonlar için highp kullanımı zorunludur, aksi takdirde geometride "titreme" (jittering) oluşur.

Tipik hatalar ve çözüm yolları

ArtefaktOlası NedenÇözüm
Siyah nesnelerShader derleme hatası (sessizce göz ardı edildi) veya sıfır dokularDerleme loglarını kontrol edin, doku descriptor'larının geçerli olduğundan emin olun
Titreme (Z-fighting)İki yüzeyin derinliğinin çakışmasıKameranın Near Plane değerini artırın, glPolygonOffset kullanın veya gölgelerde bias uygulayın
Kenarlarda "merdiven" (Aliasing)Anti-aliasing eksikliğiMSAA, TAA veya FXAA'yı etkinleştirin. Doku sampler ayarlarını kontrol edin
Pembe/Damalı dokularEksik doku veya yanlış formatVarlık yollarını ve ilgili GPU'daki doku formatı desteğini kontrol edin
Gölge artefaktlarıYanlış Bias veya shadow map çözünürlüğüNormal Bias ve Depth Bias ayarlarını yapın, PCF/VSM filtrelerini kullanın

SSS: Grafik hata ayıklama hakkında sık sorulan sorular

S: Neden profiler aynı karede farklı süreler gösteriyor? C: GPU asenkron çalışır. Süre; thermal throttling, işletim sisteminin arka plan süreçleri veya sürücü yükündeki değişkenliklere bağlı olabilir. Bir dizi ölçüm yapın (örneğin 100 kare) ve ortalama değere (avg) ile 99. yüzdelik dilime (worst case) bakın.

S: Compute Shader'ları nasıl debug ederim? C: RenderDoc'ta "Compute" sekmesini seçin. Shader'ı belirli bir thread grubu (thread group) için çalıştırabilirsiniz. Shared memory (groupshared) ve senkronizasyon bariyerlerini (GroupMemoryBarrierWithGroupSync) kontrol etmek önemlidir, çünkü veri yarışları (race conditions) burada en sık görülür.

S: Oyun driver hatası (TDR) ile çöküyorsa ne yapmalıyım? C: Bu, GPU'nun görevi belirlenen zaman sınırından (genellikle Windows'ta 2 saniye) daha uzun sürede yürüttüğü anlamına gelir. Ağır hesaplamaları birkaç kareye bölün veya en uzun süren draw call'ı optimize edin. Donma noktasını bulmak için PIX kullanın.

S: Mobil cihazda shader'ları debug edebilir miyim? C: Evet. Remote Profiling kullanın. Örneğin, Android için Snapdragon Profiler veya iOS için Xcode. Cihazı USB ile bağlayın, PC'de kare yakalama işlemi yapın ve orada analiz edin. Cihaz üzerinde doğrudan debugging, render işlemini ciddi şekilde yavaşlatır.