- macOS için OBS Studio 32.0.0 ile birlikte Apple Metal tabanlı render backend’i deneysel olarak eklendi; amaç, mevcut OpenGL’e kıyasla performans ve verimliliği artırmak
- Metal, düşük ek yük ve modern GPU mimarisini yansıtmak için tasarlanmış bir API ve OBS bunu desteklemek için GPU ile etkileşim şeklini köklü biçimde değiştirdi
- OBS’nin mevcut render motoru Direct3D merkezli bir yapıya göre tasarlandığı için, Metal backend’i shader dönüşümü ve kaynak yönetimi gibi alanlarda geniş çaplı uyumluluk çalışmaları yürütüyor
- Özellikle HLSL shader’larını gerçek zamanlı olarak MSL’ye dönüştürmek ve Direct3D’nin
map/unmap davranışını Metal içinde simüle etmek gibi karmaşık uygulamalar içeriyor
- Metal backend’i hâlâ “deneysel” aşamada, ancak OpenGL’den daha hızlı performans, Swift tabanlı güvenli kod yapısı ve EDR önizleme desteği ile macOS geliştirme ortamında önemli bir dönüm noktası oluşturuyor
Metal render motoruna geçişin genel görünümü
- OBS Studio 32.0.0’dan itibaren macOS’ta Metal grafik API’si tabanlı bir render motoru deneysel olarak sunuluyor
- Mevcut OpenGL backend’ine alternatif olarak, performans ve verimlilik artışı hedefleniyor
- Metal, GPU ile etkileşim şeklini kökten değiştiren modern bir API ve OBS buna uygun şekilde iç yapısını uyarlıyor
- Metal backend’i “Experimental” olarak işaretlenmiş durumda ve bilinen bazı sorunlar ile sınırlamalar mevcut
- OpenGL render motoru hâlâ varsayılan olarak korunuyor ve kullanıcılar Metal sürümünü doğrudan test edebiliyor
- Metal deneyimi olan geliştiricilerin geri bildirimde bulunması ve Pull Request göndermesi teşvik ediliyor
Metal’in arka planı ve tasarım felsefesi
- Apple, Metal’i ilk olarak 2014’te iPhone için duyurdu ve 2015’te Mac’e genişletti
- O dönemde Metal, Intel, AMD ve NVIDIA GPU’ları destekleyen ilk yeni nesil grafik API’lerinden biriydi
- Metal, AMD’nin Mantle yaklaşımı ile mevcut OpenGL ve Direct3D kavramlarını birleştirirken eski miras öğeleri çıkarılarak yeniden tasarlandı
- Objective-C ve Swift tabanlı API ile iOS ve macOS geliştiricilerine tanıdık bir yapı sunuyor
- Xcode içinde shader hata ayıklama ve GPU analiz özellikleri entegre olarak destekleniyor
API tasarım farkları ve OBS render motorunun uyarlanması
- Mevcut OpenGL ve Direct3D, kaynak yönetimi ve senkronizasyonu API düzeyinde otomatik olarak ele alıyordu;
Metal gibi modern API’lerde ise bunu geliştiricinin doğrudan yönetmesi gerekiyor
- Yeni API’ler GPU’yu paralel komut kuyruğu tabanlı bir işlem birimi olarak ele alıyor ve pipeline durumunu değiştirilemez nesnelerle yönetiyor
- OBS’nin mevcut render motoru Direct3D yaklaşımına göre tasarlandığından,
Metal desteği için backend düzeyinde bir uyumluluk katmanı uygulanıyor
OBS render motorunun yapısı ve Metal uyumluluk sorunları
- OBS, platforma göre Direct3D (Windows) ve OpenGL (Linux/macOS) backend’lerini kullanıyor
- Render motorunun çekirdeği API’den bağımsız olsa da, bazı Direct3D merkezli varsayımlar bulunuyor
- Başlıca kısıtlar
- Shader’lar HLSL tabanlı yazıldığı için çalıştırma sırasında dönüştürülmeleri gerekiyor
- Global değişken kullanımı, sıralı yürütme varsayımı ve Direct3D tarzı doku işleme gibi unsurlar mevcut
- Önizleme render’ı, DXGI’nin
discard model yapısına dayanıyor
Shader dönüştürme (Transpiling Shaders)
- OBS’nin efekt dosyaları HLSL ile yazılıyor ve her API’ye uygun biçimde dönüştürülüyor
- Metal desteği için HLSL → MSL dönüştürücüsü eklendi
- Başlıca farklar
- MSL’de girdi ve çıktı struct’ları ayrılmalı ve global değişken desteği yok
- Tüm uniform veriler GPU buffer’ları üzerinden iletilmeli ve fonksiyon argümanları olarak açıkça verilmesi gerekiyor
- Fonksiyon çağrılarında tip eşleşmesi ve imza doğrulaması daha katı
- Dönüştürücü, çalışma zamanında shader kodunu kısmen yeniden yazarak MSL kurallarına uyduruyor
- Örneğin HLSL’deki
uniform değişkenleri MSL’de constant buffer yapısına dönüştürüyor
int3 → uint2 + uint gibi tip dönüşüm mantıkları otomatik olarak ekleniyor
Direct3D davranışının simüle edilmesi
- OBS render motoru, Direct3D’nin
map/unmap davranışını temel alacak şekilde tasarlanmış durumda
- Metal bu tür otomatik senkronizasyonu sağlamadığından, bu işlev backend içinde doğrudan uygulanıyor
- Metal backend’inin işleyişi
- Yazma sırasında GPU buffer’ı oluşturuluyor ve CPU belleğiyle doğrudan paylaşım sağlanıyor
unmap sırasında GPU blit komutu zamanlanarak veriler dokuya kopyalanıyor
- Okuma sırasında GPU buffer’ı paylaşılıyor, ancak açık senkronizasyon ile çakışmalar önleniyor
- Sonuç olarak Direct3D’nin kaynak izleme ve senkronizasyon işlevleri, Metal içinde yeniden üretiliyor
Önizleme render sorunu ve geçici çözüm
- macOS’taki Metal Layer, DXGI’den farklı olarak uygulamanın istediği anda kare göstermesine izin vermiyor
- Sistem, ProMotion ve düşük güç modu durumuna göre kare hızını kontrol ediyor
- OBS’nin kendi render döngüsü ile macOS’un görüntüleme döngüsü uyuşmadığı için önizleme gecikmesi oluşuyor
- Geçici çözüm
- OBS önce sanal bir dokuya render ediyor, ardından ayrı bir iş parçacığı bunu ekrandaki Surface’a kopyalıyor
- Bu süreçte GPU senkronizasyonu gerekiyor ve kare uyumsuzluğu olasılığı bulunuyor
- macOS 14 sonrasında pencere bazlı bağımsız zamanlayıcılar nedeniyle ek zorluklar bekleniyor
Modern grafik API’lerinin gizli maliyeti
- Metal backend’inin geliştirilmesi aylar süren araştırma ve tekrar eden tasarım süreçlerinden geçti
- Bu durum, OpenGL→Vulkan ve D3D11→D3D12 geçişlerinde neden performans düşüşü yaşanabildiğini somut olarak gösteriyor
- Modern API’lerde sürücünün yaptığı işleri uygulamanın doğrudan üstlenmesi gerekiyor
- Bunun için GPU’nun çalışma yapısı ve komut bağımlılıkları hakkında derin bir anlayış gerekiyor
- Metal backend’i bazı ek yükleri yeniden getirse de şu avantajları sunuyor
- OpenGL ile aynı düzeyde veya daha iyi performans
- Shader ve doku hata ayıklama gibi güçlü analiz özellikleri
- Swift tabanlı güvenli kod yapısı
- EDR önizleme desteği ile yüksek kaliteli video işleme
- Xcode’un entegre analiz özellikleri sayesinde macOS için OBS bakım verimliliği artıyor ve gelecekte Metal’in varsayılan render motoru hâline gelmesi için geliştirici geri bildirimi isteniyor
1 yorum
Hacker News görüşleri
Gerçekten çok iyi bir yazıydı. shader işleme biçimi açıklaması çok etkileyiciydi
Üçüncü taraf eklenti shader'larını birden fazla backend'de çalıştırmak için gerçekten böyle bir süreçten geçmek gerekip gerekmediğini, yoksa bunun geriye dönük uyumluluğu koruma yüzünden mi böyle olduğunu merak ettim
Dış geliştiricilere “her birini tüm shader dillerinde ayrı ayrı yazın” demek çekirdek ekip açısından kolay olabilir ama pratikte pek arzu edilen bir şey değil
Herkes bunun verimsiz olduğunu düşünüyor ama pratikte alternatif yok
Yazının başlığı asıl noktayı gizliyor
“OBS Studio yeni bir renderer kullanıma alıyor: Metal'i benimseme süreci” gibi değiştirilmeli
Bu, açıkça Apple'ın Vulkan yerine kendi ekosistemini korumak için bir API yaratmasının bedelini gösteriyor
OBS Studio, Mart 2020'de 25.0 sürümünde Vulkan desteği ekledi. Aradan şimdiden 5 buçuk yıl geçti
Gömülü ortamlarda ise hâlâ OpenGL ES ağırlıklı bir yapı var
Bu konunun uzmanı değilim. Okuduklarımın belki %5'ini anlayabildim ama böyle teknik ayrıntılar içeren yazıların daha fazla olmasını isterim
Sadece duyuru metinleri pazarlama gibi hissettiriyor
Benim için yaklaşan VST3 desteği daha heyecan verici ama bu haber de sevindirici
Rockchip SoC üzerinde donanım kodlamayı ayarlamaktan çok daha kolay
Metal'in, Direct3D'nin nesne yönelimli yaklaşımını bir adım ileri taşıyıp bunu Objective-C ve Swift'in “lafı bol” API tasarımıyla birleştirdiği açıklaması ilginçti
İşletim sistemi düzeyindeki bir 3D grafik API'sinin bu kadar dinamik dil temelli tasarlanabilmesi şaşırtıcı
Bunun
objc_msgSend()optimizasyonu sayesinde olduğunu düşünüyorumVulkan/Metal/DirectX 12, tek tek çağrılar yerine birden fazla komutu komut tamponlarına koyup iletiyor
2000'lerin başında Direct3D'yi C# ile kullanmayı anlatan bir kitap vardı; bu, GC dillerinde de yüksek performanslı grafiklerin mümkün olduğuna dair algıyı değiştirmişti
Esas nokta, önceden ayrılmış tamponlara başvuran batch işleme yapısıyla çalışma zamanı ek yükünü en aza indirmek
Cocoa'dan sonra çoğu şey kısıtlı bir C++ alt kümesiyle yazıldı (ör. IOKit)
Umarım modern GPU API'leri daha basit bir şeye giden geçiş aşamasıdır
OpenGL ile aşk-nefret ilişkisi yaşadım ama yeni API'leri kullandıktan sonra OpenGL'in sadeliğini özledim
Metal'in eski Intel Mac'lerde de performansı artırıp artırmayacağını, yoksa bunun yalnızca M serisine özel bir optimizasyon mu olduğunu merak ediyorum
Ama Metal 3 hâlâ birçok Intel Mac'te destekleniyor; neden kısıtlandığı merak konusu
Bir Mac Mini ile streaming ekipmanı kurmayı düşünüyordum
Bu performans artışıyla gerçekten yeterli olup olmayacağını merak ediyorum
2D arcade oyunları ya da geliştirme ekranı gibi şeylerde sorun olmaz
Yeni AAA oyunlarda ise PC görüntüsünü bir capture card ile almak daha iyi olur
2017 civarında macOS ile yayın yapmak zordu ama bugün M serisi fazlasıyla yeterli
Bu iyileştirmeyle birlikte verimliliğin daha da artması beklenebilir
Apple'ın, Metal'in harici başarı örneklerini artırmak için daha fazla kaynak ayırmasını isterdim
Metal, Apple'ın iç kullanımı dışında henüz büyük bir başarı yakalayamadı