Konu Başlıkları Gizle
- 1 Giriş
- 2 Shader Compilation Nedir?
- 3 Shader Compilation Sırasında Neden İşlemci Kullanılıyor?
- 4 Shader Compilation Yapılmazsa Oyunlar Neden Takılır?
- 5 Her Şey Tamam, Shader CACHE Nedir?
- 6 DirectX 11, DirectX 12 ve Vulkan'da Shader Compilation Neden Farklı?
- 7 Shader Compilation ve Shader Cache Aynı Şey mi?
- 8 Shader Cache'i Silmek FPS Artırır mı?
- 9 SONUÇ & DEĞERLENDİRME
Giriş
Herkese merhaba. Bu konuda Shader Compilation'u konuşacağız.
Shader Compilation Nedir?
Son yıllarda çıkan birçok AAA oyunu ilk kez açtığımızda Compiling Shaders, Building Shader Cache veya Preparing Shaders gibi bir ekran bizleri karşlılayabiliyor. Bu işlem bazen birkaç saniye sürerken bazen de kullandığımız bileşenlere bağlı olarak 10-20 dakikaya kadar bile bulabiliyor. Peki oyun neden bunu yapıyor ve neden ilk açılışta beklemek zorunda kalıyoruz ki?
Bunu anlamak için temelde önce Shader kavramını öğrenmemiz gerekecek.
Kim Ulan Bu Shader?
Shader, ekran kartının, ekrandaki görüntüyü oluştururken kullandığı küçük program parçalarıdır desek yanlış olmaz sanırım. Bir nesnenin metal gibi mi, cam gibi mi, mat mı yoksa parlak mı görüneceğini, ışığın yüzeyden nasıl yansıyacağını, gölgelerin nasıl hesaplanacağını, suyun nasıl dalgalanacağını veya sis efektinin nasıl oluşturulacağını vesaire unsurları belirleyen kodlar Shader'lardır. Modern oyunlarda binlerce hatta on binlerce farklı Shader bulunabilir. Karakterler, silahlar, patlamalar, bitkiler, hava durumu, yansımalar ve daha aklınıza gelebilecek birçok efekt için farklı Shader'lar kullanılır.
Peki Shader Compilation?
Ancak geliştiricilerin yazdığı bu Shader kodları, ekran kartının doğrudan çalıştırabileceği formatta değil. İşte burada da Shader Compilation devreye giriyor. Shader Compilation, oyunun içerdiği Shader kodlarını bilgisayarınızdaki ekran kartı ve grafik API'sine uygun makine koduna dönüştürme işlemi oluyor. Başka bir deyişle oyun, ekran kartına "Bunu böyle çiz kardeşim." demek yerine önce "Gel senin anlayacağın dile çevireyim." der. Bu sayede de ekran kartı, Shader'ları çok daha hızlı çalıştırabilir ve oyun sırasında aynı işlemleri tekrar tekrar çevirmek zorunda kalmaz.
Ancak bu dönüşüm işlemi binlerce Shader için yapıldığında ciddi miktarda işlemci gücü ve zaman gerektiriyor. Bu yüzden birçok modern oyun, sizi doğrudan menüye almak yerine ilk açılışta Shader Compilation ekranını göstererek tüm hazırlıkları önceden tamamlamayı tercih eder.
Shader Compilation Sırasında Neden İşlemci Kullanılıyor?
Shader Compilation ekranını açtığınızda çoğu zaman işlemcinin kullanımının %80-100 seviyelerine çıktığını, buna karşılık ise ekran kartının ise %5-20 civarında çalıştığını görebilirsiniz. İlk bakışta bu durum garip gelebilir size. Sonuçta Shader'lar ekran kartında çalışıyorsa neden hazırlık aşamasında yük işlemciye biniyor değil mi? Böyle düşünmeniz doğal.
İşte bunun sebebi, çalıştırmak ile derlemek (compile etmek) işlemlerinin tamamen farklı şeyler olması.
Shader'lar geliştiriciler tarafından HLSL, GLSL veya benzeri Shader dilleriyle yazılır. Bu kodlar insanların okuyabileceği seviyededir ancak GPU bunları doğrudan çalıştıramaz. Önce ekran kartı sürücüsünün ve grafik API'sinin anlayacağı düşük seviyeli komutlara dönüştürülmeleri gerekiryor. Bu dönüştürme işlemi yani compilation, büyük ölçüde işlemci tarafından gerçekleştirilir. Çünkü işlemci, karmaşık kodları analiz etme, optimize etme ve makine koduna çevirme konusunda GPU'dan çok daha uygundur. İşlem tamamlandıktan sonra ortaya çıkan Shader kodları ekran kartına gönderilir ve artık bunları doğrudan çalıştırabilir.
Bu sebeplerden ötürü aşağıya belirttiğim maddeleri Shader Compilation esnasında görmeniz mümkün:
- İşlemci kullanımı çok yüksek olur.
- GPU kullanımı oldukça düşük olur.
- SSD'den yoğun veri okunabilir.
- Fanlar özellikle işlemci tarafında hızlanabilir.
AMD, bu konuda özellikle son yıllarda önde. Zaten modern oyun motorları Shader Compilation işlemini mümkün olduğunca paralel hale getirirler. Yani binlerce Shader tek tek değil, aynı anda birçok çekirdeğe dağıtılarak derleniyor. Nasıl mı?
Örneğin:
- 6 veya 8 çekirdekli bir işlemci aynı anda daha az Shader derleyebilir.
- 12 veya 16 çekirdekli bir işlemci ise bu işi çok daha kısa sürede tamamlayabilir.
GPU, Neden Kendi Shader'ını Derlemiyor?
Aslında teorik olarak bakarsak GPU da belirli derleme işlemlerini yapabilir. Ancak bu oldukça verimsiz olabilirdi. GPU'nun tasarım amacı milyonlarca pikseli ve matematiksel işlemi aynı anda hesaplamak. Karmaşık kod analizi, optimizasyon ve derleme gibi dallanması budaklanması fazla olan işlemler ise CPU'nun uzmanlık alanı.
Kısacası CPU, Shader'ları hazırlar; GPU ise onları çalıştırır.
Bu iş bölümü sayesinde oyunlar çok daha verimli çalışabilir ve ekran kartı, asıl gücünü görüntü üretmeye ayırır. Shader Compilation sırasında GPU'nun boşta gibi görünmesinin nedeni de tam olarak bu.
Shader Compilation Yapılmazsa Oyunlar Neden Takılır?
Shader Compilation işleminin amacı yalnızca oyunun ilk açılışında sizi birkaç dakika bekletmek de değil ha. Asıl hedef, oyun sırasında yaşanabilecek ani takılmaları, işte stuttering gibi, mümkün olduğunca önlemek.
Bunu daha iyi anlamak için şöyle bir senaryo düşünelim:
Sallıyorum Witcher 3 oynuyorsunuz. İlk kez yeni bir bölgeye girdiniz. Daha önce hiç görmediğiniz bir karakter, farklı bir silah efekti, patlama animasyonu veya hava durumu efekti ekrana geliyor. Eğer bu nesnelere ait Shader'lar önceden derlenmemişse, oyun o anda durup gerekli Shader'ı hazırlamak zorunda kalır sizin için.
İşte sorun da genelde burada doğuyor. Çünkü normalde GPU her kareyi belirli bir süre içinde oluşturuyor.
Örneğin:
- 60 FPS alınıyorsa her kare ortalama 16.7 ms
- 120 FPS alınıyorsa her kare ortalama 8.3 ms
- 144 FPS alınıyorsa her kare ortalama 6.9 ms
Ancak oyun, yeni bir Shader derlemek zorunda kaldığında bu süre bir anda 40-50 ms, hatta bazı durumlarda 100 ms'nin bile üzerine çıkabiliyor ki bunlar ciddi süreler. İşte oyuncunun hissettiği o anlık kasma, mikro takılma veya "Oyun dondu sonra devam etti." hissi aslında bu gecikmeden kaynaklanır bazı durumlarda. Burada, forumda da stutterlar ile ilgili çok fazla konu açılıyor fakat kimsenin umursadığı bir durum bile değil belki de bu Shader işlemleri. Aslında önemli bir mevzu.
Ortalama FPS Yüksek Olsa Bile Oyun Takılabilir
Birçok kullanıcı "Ortalama 140 FPS alıyorum ama oyun akıcı hissettirmiyor." diye yorum yapar geçer. Bunun nedeni de çoğu zaman ortalama FPS değil, Frame Time değerleridir.
Örneğin, oyununuz normalde:
- 7 ms
- 7 ms
- 7 ms
- 7 ms
- 7 ms
- 7 ms
* 55 ms
- 7 ms
- 7 ms
- 7 ms
İşte bu yüzden teknik incelemelerde yalnızca ortalama FPS değil, 1% Low ve 0.1% Low FPS değerleri de paylaşılır. Çünkü shader kaynaklı takılmalar en çok bu metrikleri olumsuz etkiler.
Bu başlığa/konuya ithafen bu rehberim fikir verebilir konuyla alakalı. Göz atabilirsiniz:
Giriş
Merhaba. Bu konuda mikro takılmaları konuşacağız. Bu başlık altında oyunlarda FPS yüksek görünmesine rağmen mikro takılmaların, anlık giren dropların vesaire sebeplerini ele alıyor olacağız. Bölüm bölüm ilerleyeceğiz. Umarım faydalı ve açıklayıcı olur. Teşekkür ederim.
Bir oyunu açıyorsunuz, FPS sayacına bakıyorsunuz ve ekranda 200, 300 hatta 500 FPS gibi sayılar görüyorsunuz. Kağıt üzerinde her şey kusursuz görünüyor. Sonuçta yıllardır bize öğretilen şey şu: ''FPS ne kadar yüksekse oyun o kadar akıcıdır.'' Peki o zaman neden bazen fare hareketleri...
Merhaba. Bu konuda mikro takılmaları konuşacağız. Bu başlık altında oyunlarda FPS yüksek görünmesine rağmen mikro takılmaların, anlık giren dropların vesaire sebeplerini ele alıyor olacağız. Bölüm bölüm ilerleyeceğiz. Umarım faydalı ve açıklayıcı olur. Teşekkür ederim.
Bir oyunu açıyorsunuz, FPS sayacına bakıyorsunuz ve ekranda 200, 300 hatta 500 FPS gibi sayılar görüyorsunuz. Kağıt üzerinde her şey kusursuz görünüyor. Sonuçta yıllardır bize öğretilen şey şu: ''FPS ne kadar yüksekse oyun o kadar akıcıdır.'' Peki o zaman neden bazen fare hareketleri...
Açık Dünya Oyunlarında Neden Daha Fazla Görülüyor?
Shader Stuttering en çok açık dünya oyunlarında karşımıza çıkar, galiba kimse de inkar etmez bunu. Çünkü oyuncu sürekli yeni bölgeler keşfeder, farklı NPC'lerle karşılaşır, değişen hava koşullarını görür ve yeni efektler ekrana gelir. Her yeni içerik, daha önce derlenmemiş Shader'ların devreye girmesine neden olabilir. Bu yüzden açık dünya oyunlarında Shader Cache eksikliği çok daha belirgin hissedilir. Buna karşılık daha doğrusal ilerleyen oyunlarda aynı sahneler tekrarlandığı için Shader'lar kısa sürede önbelleğe alınır ve takılmalar azalır.
Bunlardan ötürü bazı oyunlarda ilk açılışta uzun süre beklemeler olabiliyor. Buna karşılık geliştiriciler 2 farklı yaklaşık kullanabilir:
- Shader'ları oyunun başında topluca derlemek.
- Oyun oynanırken ihtiyaç oldukça derlemek.
Bu nedenle günümüzde birçok modern oyun, ilk açılışta uzun süren Shader Compilation ekranını göstermeyi tercih ediyor. Birkaç dakikalık bekleme, oyun boyunca yaşanabilecek yüzlerce mikro takılmayı önleyebiliyor.
Her Şey Tamam, Shader CACHE Nedir?
Asıl soru şu: Oyun ilk açılışta binlerce Shader'ı derlediyse, her oyunu açışımızda neden aynı işlemi tekrar yapmıyoruz?
xD
Bunun cevabı Shader Cache (Shader Önbelleği) adı verilen sistem. Yani? Yani, Shader Compilation tamamlandıktan sonra ortaya çıkan derlenmiş Shader'lar yalnızca RAM'de tutulmaz. Oyun ve ekran kartı sürücüsü, bunları SSD veya HDD üzerinde özel önbellek dosyalarına kaydeder. Böylece oyun bir sonraki açılışta aynı Shader'ları yeniden derlemek yerine doğrudan bu hazır dosyaları kullanabilir. Bu da hem açılış süresini kısaltır hem de oyun sırasında oluşabilecek gereksiz takılmaları azaltır.
Gelin basitçe özetleyelim:
1 - Oyun, Shader kodlarını oluşturur.
2 - İşlemci, bu Shader'ları derler.
3 - Derlenen sürümler Shader Cache'e kaydedilir.
4 - Sonraki çalıştırmalarda doğrudan Cache kullanılır.
Peki Neden Bazen Yeniden Derleniyor?
Birçok kullanıcı şu durumu yaşamıştır: "Oyunu geçen hafta açmıştım, bugün yine Shader Compilation yapıyor.''
Bu durum normal. Çünkü Shader Cache her zaman geçerliliğini korumaz.
Yeniden derleme gerektirebilecek başlıca durumlar şunlar olabilir:
- Ekran kartı sürücüsünün güncellenmesi
- Oyunun büyük bir güncelleme alması
- Grafik API'sinde değişiklik yapılması (örneğin DirectX 11'den DirectX 12'ye geçiş)
- Shader cache dosyalarının silinmesi
- Windows'un bazı sistem önbelleklerini temizlemesi
- Ekran kartının değişmesi
Örneğin NVIDIA sürücüsünü güncellediğinizde, sürücü Shader optimizasyonlarında değişiklik yapmış olabilir. Eski Cache artık yeni sürücüyle tam uyumlu olmayacağı için oyun Shader'ları yeniden derler. Aynı durum AMD ve Intel ekran kartları için de geçerli.
Shader Cache Bozulabilir mi?
Evet. Her ne kadar sık görülmese de Shader Cache dosyaları zaman zaman bozulabilir. İmkansız değil.
Böyle bir şey olursa şu tarz belirtiler görebilirsiniz:
- Daha önce akıcı çalışan oyunun sürekli Shader Compilation istemesi
- İlk açılıştan sonra bile devam eden mikro takılmalar
- Bazı grafik efektlerinin geç yüklenmesi
- Nadir de olsa görsel hatalar veya çökmeler
Ancak sırf temizlik olsun diye Shader Cache'i düzenli olarak silmek doğru bir alışkanlık değil. Çünkü her silme işleminden sonra oyunların Shader'ları baştan derlemesi gerekir. Bu da hem zaman kaybına yol açar hem de ilk oynanışta yeniden stuttering yaşanmasına neden olabilir.
Kısacası Shader Cache, ekran kartının daha önce yaptığı hazırlıkları saklayan bir çalışma alanı. Sağlıklı çalıştığında hem yükleme sürelerini hem de oyun içi akıcılığı olumlu yönde etkiler. Bu nedenle gerçekten bir sorun yaşanmadığı sürece cache dosyalarına müdahale etmek yerine olduğu gibi bırakmak genellikle en doğru seçenektir.
DirectX 11, DirectX 12 ve Vulkan'da Shader Compilation Neden Farklı?
Her oyunda Shader Compilation ekranı görmememizin nedeni, kullanılan grafik API'sinin Shader yönetimini farklı şekilde ele alması desek yanlış olmaz. Özellikle DirectX 11, DirectX 12 ve Vulkan arasında bu konuda önemli farklar var.
DirectX11: İşin Büyük Kısmını Sürücü Üstlenir
DirectX 11 döneminde Shader yönetiminin önemli bir kısmı ekran kartı sürücüsüne bırakılıyordu, hatırlarsınız. Yani oyun geliştiricisi her detayı yönetmek zorunda değildi. NVIDIA, AMD veya Intel sürücüsü Shader'ları gerektiğinde derliyor, önbelleğe alıyor ve optimize ediyordu. Bu nedenle birçok DX11 oyununda açılışta uzun bir Compiling Shaders ekranı görmezsiniz.
Ancak bunun bir dezavantajı var ki o da; Shader'lar çoğu zaman oyun oynanırken derlenmeye devam eder. Oyuncu yeni bir efektle ilk kez karşılaştığında sürücü arka planda compilation işlemi yapabilir ve bu da kısa süreli stutteringe yol açabilir.
DirectX12: Daha Fazla Kontrol, Daha Fazla Sorumluluk
DirectX 12 ile birlikte Microsoft, geliştiricilere donanım üzerinde çok daha fazla kontrol sağlamaya başladı. Bunun karşılığında ise Shader yönetimi gibi birçok sorumluluk artık oyun motoruna geçti. Artık geliştiriciler, Shader'ların ne zaman derleneceğine, Pipeline State Object (PSO) oluşturulmasına, nasıl önbelleğe alınacağına, bellek yönetimine kendisi karar veriyor.
Bu yüzden birçok DX12 oyunu ilk açılışta Shader Compilation ekranı gösteriyor. Aslında amaç kullanıcıyı bekletmek değil, oyunun ilerleyen saatlerinde oluşabilecek stutteringi en aza indirmek.
Vulkan da Benzer Mantıkla Çalışıyor
Vulkan da DirectX 12 gibi düşük seviyeli bir grafik API'si. Burada da Shader yönetiminin büyük kısmı geliştiricinin kontrolünde oluyor. Bu nedenle Vulkan kullanan oyunlarda da ilk açılışta Shader Compilation görmek oldukça yaygın. Hatta bazı oyunlar her büyük güncellemeden sonra shader cacheyi tamamen yeniden oluşturur.
Neden Bazı DX12 Oyunları Yine de Takılıyor?
Burada önemli olan yalnızca API değil, bilmek lazım. Asıl belirleyici unsur, geliştiricinin Shader sistemini ne kadar iyi uyguladığı.
İyi optimize edilmiş bir DX12 oyunu:
- İlk açılışta birkaç dakika Shader derler
- Sonrasında oldukça akıcı çalışır
- Shader compilation yapsa bile
- Oyun sırasında yeni shader'lar oluşturmaya devam edebilir
- Bunun sonucunda mikro takılmalar tamamen ortadan kalkmayabilir
Yani özetle bu DX ve Vulkan meselesinde DirectX 11, Shader derleme işini büyük ölçüde sürücüye bırakırken; DirectX 12 ve Vulkan bu sorumluluğu geliştiriciye devreder. Bu nedenle günümüzde birçok modern oyunda açılışta Shader Compilation ekranı görmek aslında kötü bir durum değil, aksine daha akıcı bir oyun deneyimi sunmak için tercih edilen bir yöntemdir.
Oyunun sizi birkaç dakika bekletmesi can sıkıcı olabilir, ancak bunun karşılığında oyun boyunca yaşanacak yüzlerce anlık takılmanın önüne geçilebilir.
Shader Compilation ve Shader Cache Aynı Şey mi?
Aslında Shader Compilation ve Shader Cache kavramları sık sık birbiriyle karıştırılıyor. Aslında biri işlemi, diğeri ise o işlemin sonucunu saklayan sistemi ifade eder bize.
Özetleyelim:
Shader Compilation: Shader kodlarının ekran kartının anlayabileceği makine koduna dönüştürülmesi işlemi.
Shader Cache: Derleme tamamlandıktan sonra oluşan Shader'ların tekrar kullanılmak üzere depolandığı önbellek.
Yani compilation, üretim aşamasıdır; cache ise depolama aşamasıdır.
Bunu bir yemek örneğiyle düşünebilirsiniz. Yemeği pişirmek compilation ise, pişen yemeği buzdolabına koymak cache işlemidir. Ertesi gün aynı yemeği yeniden pişirmek yerine dolaptan çıkarıp ısıtmanız yeterlidir xD
Shader Cache'i Silmek FPS Artırır mı?
İnternette sıkça "Shader Cache'i temizledim, FPS'im arttı." şeklinde yorumlara rastlanabiliyor. Ancak teknik açıdan bakıldığında Shader Cache'in doğrudan yüzde yüz olarak FPS artıran bir özelliği yok.
Hatta çoğu durumda tam tersi yaşanır. Cache silindiğinde oyun, daha önce derlediği tüm Shader'ları yeniden oluşturmak zorunda kalır. Bu da ilk açılışın uzamasına ve ilk oyun seansında yeniden Shader Compilation yapılmasına neden oluyor. Dolayısıyla sadece performans artsın düşüncesiyle Shader Cache'i düzenli olarak silmek doğru bir yöntem değil.
Peki Ne Zaman Silinmeli?
- Ekran kartı sürücüsü güncellendikten sonra sürekli stutter sorunu yaşanıyorsa
- Oyun her açılışta gereksiz yere Shader Compilation yapıyorsa
- Grafik hataları veya bozuk efektler oluşuyorsa
- Shader Cache dosyalarının bozulduğundan şüpheleniliyorsa
SONUÇ & DEĞERLENDİRME
Shader compilation, ilk bakışta yalnızca oyunun açılışını uzatan bir işlem gibi görünse de aslında modern oyunların akıcı çalışabilmesi için kritik bir hazırlık aşaması. Bu süreçte işlemci, geliştiricilerin yazdığı shader kodlarını ekran kartının doğrudan çalıştırabileceği formata dönüştürür ve oluşan dosyalar Shader Cache'e kaydedilir. Böylece aynı Shader'ların her oyun açılışında yeniden derlenmesine gerek kalmaz.
Özellikle DirectX 12 ve Vulkan gibi düşük seviyeli grafik API'lerinde Shader yönetiminin büyük bölümü oyun motorunun sorumluluğunda. Bu nedenle günümüzde birçok AAA oyunun ilk açılışta Compiling Shaders ekranı göstermesi normal. Birkaç dakikalık bekleme, oyun sırasında yaşanabilecek yüzlerce mikro takılmanın önüne geçebiliyor.
Öte yandan her stuttering sorununun sebebi de Shader Compilation değil. İşlemci darboğazı, yetersiz VRAM, depolama performansı, sürücü sorunları veya oyun optimizasyonu gibi pek çok farklı etken de benzer belirtiler oluşturabiliyor. Bu nedenle bir oyunda takılma yaşandığında tek suçluyu Shader sistemi olarak görmek doğru olmaz.
Son olarak, internette sıkça önerilen "Shader Cache'i düzenli olarak silin." tavsiyesi de her zaman doğru değildir. Cache dosyaları yalnızca bozulma, sürücü değişikliği veya teknik bir sorun yaşandığında temizlenmeli. Sorunsuz çalışan bir Shader Cache, oyunun daha hızlı açılmasına ve daha stabil bir deneyim sunmasına yardımcı olur. Bir Japon atasözü der ki ''Çalışıyorsa elleme.''
Efenim, özetle ve kısacası, ilk açılışta birkaç dakika beklemek can sıkıcı olabilir; ancak bu süreç tamamlandıktan sonra oyun, ekran kartınızı çok daha verimli kullanır ve daha akıcı bir oynanış sunar. Modern oyunlarda gördüğünüz "Compiling Shaders" ekranı, çoğu zaman bir sorun değil; tam tersine daha iyi bir oyun deneyimi için yapılan önemli bir optimizasyon adımıdır.
Bu konu bu kadardı.
Teşekkür ederim. İyi forumlar dilerim.
Son düzenleme: