OBS Studio Mengadopsi Renderer Baru: Proses OBS Mengadopsi Metal
(obsproject.com)- Mulai OBS Studio 32.0.0 untuk macOS, backend renderer berbasis Apple Metal ditambahkan secara eksperimental, dengan tujuan meningkatkan performa dan efisiensi dibanding OpenGL yang ada saat ini
- Metal adalah API yang dirancang untuk overhead rendah dan mencerminkan arsitektur GPU modern, dan untuk mendukungnya OBS harus mengubah secara mendasar cara berinteraksi dengan GPU
- Karena renderer OBS yang ada sebelumnya dibangun dengan struktur berpusat pada Direct3D, backend Metal memerlukan pekerjaan kompatibilitas skala besar pada hal-hal seperti konversi shader dan manajemen resource
- Secara khusus, implementasinya mencakup hal kompleks seperti mengonversi shader HLSL ke MSL secara real-time dan mensimulasikan perilaku
map/unmapmilik Direct3D di dalam Metal - Backend Metal masih berada pada tahap "eksperimental", tetapi menjadi titik balik penting untuk peningkatan lingkungan pengembangan macOS melalui performa yang lebih cepat daripada OpenGL, struktur kode aman berbasis Swift, dan dukungan pratinjau EDR
Gambaran Umum Penerapan Renderer Metal
- Sejak OBS Studio 32.0.0, renderer berbasis API grafis Metal tersedia secara eksperimental di macOS
- Ditujukan sebagai alternatif backend OpenGL yang ada, dengan target peningkatan performa dan efisiensi
- Metal adalah API modern yang secara mendasar mengubah cara interaksi dengan GPU, dan OBS menyesuaikan struktur internalnya agar selaras dengan hal itu
- Backend Metal ditandai sebagai "Experimental" dan masih memiliki beberapa masalah serta keterbatasan yang sudah diketahui
- Renderer OpenGL tetap menjadi default, dan pengguna dapat mencoba versi Metal secara langsung
- Umpan balik serta partisipasi Pull Request dari developer yang berpengalaman dengan Metal sangat dianjurkan
Latar Belakang Metal dan Filosofi Desainnya
- Apple pertama kali memperkenalkan Metal untuk iPhone pada 2014, lalu memperluasnya ke Mac pada 2015
- Saat itu, Metal merupakan salah satu API grafis generasi berikutnya pertama yang mendukung GPU Intel, AMD, dan NVIDIA sekaligus
- Metal menggabungkan konsep dari Mantle milik AMD serta OpenGL dan Direct3D yang sudah ada, tetapi dirancang ulang dengan membuang elemen legacy
- Dengan API berbasis Objective-C dan Swift, strukturnya terasa familier bagi developer iOS dan macOS
- Mendukung integrasi debugging shader dan analisis GPU langsung di dalam Xcode
Perbedaan Desain API dan Adaptasi Renderer OBS
- OpenGL dan Direct3D sebelumnya menangani manajemen resource dan sinkronisasi secara otomatis di level API,
sedangkan API modern seperti Metal mengharuskan developer mengelolanya sendiri - API baru memperlakukan GPU sebagai perangkat pemrosesan berbasis command queue paralel, dengan state pipeline dikelola sebagai objek immutable
- Renderer lama OBS dirancang mengikuti pendekatan Direct3D,
sehingga untuk mendukung Metal diperlukan lapisan kompatibilitas di level backend
Struktur Renderer OBS dan Masalah Kompatibilitas Metal
- OBS menggunakan backend Direct3D (Windows) dan OpenGL (Linux/macOS) sesuai platform
- Inti renderer bersifat independen terhadap API, tetapi masih ada beberapa asumsi yang berpusat pada Direct3D
- Keterbatasan utama
- Shader ditulis berbasis HLSL, sehingga perlu dikonversi saat dijalankan
- Ada penggunaan variabel global, asumsi eksekusi berurutan, serta penanganan tekstur ala Direct3D
- Rendering pratinjau bergantung pada model
discardmilik DXGI
Konversi Shader (Transpiling Shaders)
- File efek OBS ditulis dalam HLSL dan dikonversi agar sesuai dengan masing-masing API
- Untuk dukungan Metal, ditambahkan konverter HLSL → MSL
- Perbedaan utama
- MSL mengharuskan struct input dan output dipisahkan, serta tidak mendukung variabel global
- Semua data uniform harus dikirim melalui buffer GPU dan diteruskan secara eksplisit sebagai argumen fungsi
- Saat pemanggilan fungsi, kecocokan tipe dan verifikasi signature diterapkan secara ketat
- Konverter tersebut menulis ulang sebagian kode shader saat runtime agar sesuai dengan aturan MSL
- Contohnya, variabel
uniformpada HLSL diubah menjadiconstant bufferpada MSL - Logika konversi tipe seperti
int3→uint2+uintjuga disisipkan secara otomatis
- Contohnya, variabel
Simulasi Perilaku Direct3D
- Renderer OBS dirancang dengan asumsi perilaku
map/unmapmilik Direct3D- Karena Metal tidak menyediakan sinkronisasi otomatis seperti itu, implementasinya dilakukan langsung di backend
- Cara kerja backend Metal
- Saat menulis, dibuat buffer GPU yang berbagi langsung dengan memori CPU
- Saat
unmap, perintah blit GPU dijadwalkan untuk menyalin ke tekstur - Saat membaca, buffer GPU tetap dibagikan, tetapi sinkronisasi eksplisit digunakan untuk mencegah benturan
- Hasilnya, pelacakan resource dan sinkronisasi ala Direct3D direproduksi di dalam Metal
Masalah Rendering Pratinjau dan Solusi Sementara
- Metal Layer di macOS, tidak seperti DXGI, tidak memungkinkan aplikasi menampilkan frame secara sembarang
- Sistem mengontrol frame rate berdasarkan ProMotion dan mode hemat daya
- Ketidakselarasan antara render loop milik OBS dan siklus tampilan macOS menyebabkan latensi pratinjau
- Solusi sementara
- OBS terlebih dahulu merender ke tekstur virtual, lalu thread terpisah menyalinnya ke Surface layar
- Proses ini memerlukan sinkronisasi GPU, dan tetap ada kemungkinan ketidakcocokan frame
- Setelah macOS 14, timer independen per jendela diperkirakan akan menambah tantangan baru
Biaya Tersembunyi dari API Grafis Modern
- Pengembangan backend Metal memerlukan riset selama berbulan-bulan dan desain berulang
- Ini menunjukkan secara nyata mengapa perpindahan OpenGL→Vulkan atau D3D11→D3D12 bisa menimbulkan penurunan performa
- Pada API modern, pekerjaan yang dulu dilakukan driver kini harus ditangani langsung oleh aplikasi
- Dibutuhkan pemahaman mendalam tentang cara kerja GPU dan dependensi antar perintah
- Backend Metal memang memperkenalkan kembali sebagian overhead, tetapi tetap menawarkan manfaat berikut
- Performa setara atau lebih baik daripada OpenGL
- Fitur analisis yang kuat seperti debugging shader dan tekstur
- Struktur kode aman berbasis Swift
- Dukungan pratinjau EDR untuk pemrosesan video berkualitas tinggi
- Melalui fitur analisis terintegrasi di Xcode, efisiensi pemeliharaan OBS di macOS meningkat, dan tim meminta umpan balik developer untuk membantu transisi Metal menjadi renderer default di masa mendatang
1 komentar
Komentar Hacker News
Tulisan yang sangat bagus. Penjelasan tentang cara pemrosesan shader benar-benar mengejutkan
Saya jadi penasaran apakah memang harus melalui proses seperti itu agar shader plugin pihak ketiga bisa berjalan di berbagai backend, atau apakah itu dilakukan karena menjaga kompatibilitas ke belakang
Dari sudut pandang tim inti, mungkin mudah untuk meminta pengembang eksternal “menulis semuanya dalam masing-masing bahasa shader”, tetapi secara realistis itu bukan pendekatan yang diinginkan
Semua orang menganggapnya tidak efisien, tetapi dalam praktiknya memang tidak ada alternatif yang nyata
Judul artikelnya menyembunyikan inti persoalan
Seharusnya diubah menjadi sesuatu seperti “OBS Studio mengadopsi renderer baru: proses adopsi Metal”
Ini dengan jelas menunjukkan harga yang harus dibayar karena Apple membuat API untuk melindungi ekosistemnya sendiri alih-alih memakai Vulkan
OBS Studio menambahkan dukungan Vulkan pada Maret 2020, di versi 25.0. Sudah lewat 5 tahun setengah
Di lingkungan embedded pun OpenGL ES masih tetap dominan
Saya bukan ahli di topik ini. Saya mungkin cuma paham sekitar 5% dari yang saya baca, tetapi saya ingin lebih banyak tulisan berisi penjelasan teknis seperti ini
Pengumuman biasa terasa seperti materi pemasaran
Secara pribadi saya lebih menantikan dukungan VST3 yang akan datang, tetapi kabar ini juga menyenangkan
Jauh lebih mudah daripada menyiapkan hardware encoding di SoC Rockchip
Menarik melihat penjelasan bahwa Metal mengembangkan lebih lanjut pendekatan berorientasi objek dari Direct3D lalu menggabungkannya dengan desain API Objective-C dan Swift yang “banyak bicara”
Mengejutkan bahwa API grafis 3D tingkat OS bisa dibuat dengan pendekatan berbasis bahasa dinamis seperti ini
Saya rasa ini berkat optimasi
objc_msgSend()Vulkan/Metal/DirectX 12 mengirim banyak perintah sekaligus dalam command buffer, bukan lewat pemanggilan satu per satu
Pada awal 2000-an ada buku tentang penggunaan Direct3D dari C#, dan itu mengubah cara pandang bahwa grafik berperforma tinggi juga mungkin di bahasa dengan GC
Intinya adalah meminimalkan overhead runtime lewat struktur pemrosesan batch yang mereferensikan buffer yang sudah dialokasikan sebelumnya
Sejak era Cocoa, sebagian besar ditulis dengan subset C++ yang dibatasi (misalnya IOKit)
Saya berharap API GPU modern hanyalah tahap transisi menuju sesuatu yang lebih sederhana
OpenGL adalah hubungan cinta-benci, tetapi setelah mencoba API baru, saya malah merindukan kesederhanaan OpenGL
Saya penasaran apakah Metal akan meningkatkan performa juga di Mac Intel lama, atau apakah ini optimasi khusus seri M
Namun Metal 3 masih didukung di beberapa Mac Intel juga, jadi aneh kenapa dibatasi seperti itu
Saya sempat berpikir untuk merakit perangkat streaming dengan Mac Mini
Saya penasaran apakah peningkatan performa kali ini sudah cukup untuk itu
Kalau hanya game arcade 2D atau layar pengembangan, seharusnya tidak masalah
Kalau game AAA terbaru, lebih baik ambil tampilan PC lewat capture card
Sekitar 2017, streaming di macOS memang sulit, tetapi sekarang seri M sudah cukup memadai
Dengan peningkatan kali ini, saya berharap efisiensinya akan jadi lebih baik lagi
Saya berharap Apple menginvestasikan lebih banyak sumber daya agar Metal punya lebih banyak kisah sukses eksternal
Di luar internal Apple, Metal masih belum terlalu sukses besar