Saat membuat renderer yang mendukung banyak API grafik, Anda biasanya ingin mengabstraksikan kode Anda di semacam perpustakaan tingkat rendah yang diikat dengan beberapa API grafik seperti OpenGL, Vulkan, D3D11 dan sebagainya;
Mereka bekerja sangat berbeda satu sama lain, sehingga membuat API generik yang baik menjadi penting; Saya telah membaca bahwa Anda biasanya ingin menggunakan "back-end" yang mengimplementasikan fungsionalitas dasar untuk setiap API yang ingin Anda dukung, dan "front-end" yang digunakan oleh programmer untuk menggambar hal-hal di layar.
Bagaimana saya tahu kalau saya membuat abstraksi yang terlalu ketat?
graphics-programming
Gabriele Vierti
sumber
sumber
Jawaban:
Pertama-tama, pertimbangkan apakah benar-benar layak untuk mendukung lebih dari satu API grafik. Hanya menggunakan OpenGL akan mencakup sebagian besar platform dan akan "cukup baik" untuk semua kecuali proyek yang paling ambisius secara grafis. Kecuali jika Anda bekerja untuk studio game yang sangat besar yang mampu menenggelamkan beberapa ribu orang-jam ke dalam implementasi dan pengujian beberapa rendering backend dan kecuali ada beberapa fitur spesifik DirectX atau Vulcan yang benar - benar ingin Anda pamerkan, biasanya tidak sepadan dengan kerumitannya. . Terutama mengingat bahwa Anda dapat menyimpan banyak pekerjaan dengan menggunakan lapisan abstraksi yang dibuat orang lain (perpustakaan pihak ke-3 atau mesin game).
Tapi mari kita asumsikan bahwa Anda sudah mengevaluasi opsi Anda dan sampai pada kesimpulan bahwa itu layak dan layak waktu untuk menggulung pilihan Anda.
Lalu juri utama arsitektur perangkat lunak lapisan abstraksi Anda adalah programmer front-end Anda.
Jika demikian, Anda berhasil.
sumber
Mulailah dengan mengidentifikasi apa yang sebenarnya Anda butuhkan dari bagian "wrapper" dari API. Ini umumnya sangat, sangat sederhana: Anda memerlukan sumber daya dasar (buffer, shader, tekstur, keadaan pipa) dan cara untuk menggunakan sumber daya tersebut untuk membangun bingkai dengan mengirimkan beberapa panggilan draw.
Cobalah untuk menjaga logika tingkat tinggi apa pun dari bagian pembungkus API. Jika Anda menerapkan teknik penyisihan adegan pintar di bagian API ini, nah sekarang Anda berada di hook untuk menduplikasi logika itu di semua implementasi backend. Itu banyak usaha ekstra, jadi tetap sederhana. Manajemen adegan harus menjadi bagian dari bagian API tingkat tinggi yang menggunakan bungkus daripada menjadi bagian dari bungkus itu sendiri.
Pilih target yang akan Anda dukung dan pahami. Sulit untuk menulis pembungkus yang layak untuk "segalanya," dan Anda mungkin tidak perlu (bisa dibilang Anda tidak perlu menulis satu bungkus pun, seperti yang disebutkan dalam jawaban Philipp ). Hampir tidak mungkin untuk menulis pembungkus yang layak jika Anda tidak tahu API yang akan Anda bungkus.
Evaluasi keadaan API Anda secara teratur. Seharusnya secara umum memiliki area permukaan yang lebih kecil daripada API yang dibungkus di bawahnya; jika Anda menemukan diri Anda membuat jenis pembungkus satu-ke-satu untuk setiap struktur D3D atau setiap panggilan fungsi OpenGL Anda mungkin membelok di luar jalur.
Lihatlah pekerjaan apa yang telah terjadi sebelumnya. Sokol dan BGFX adalah API yang menyediakan tingkat agnostisisme yang mungkin berguna bagi Anda, dan relatif mudah dipahami (terutama yang pertama).
sumber
Poin lain yang belum disebutkan yang harus Anda pertimbangkan adalah apa tujuan kinerja Anda. Jika tujuan Anda adalah memiliki pustaka grafis yang akan menghasilkan kinerja yang baik dari platform perangkat keras yang murah, tetapi juga dapat digunakan pada berbagai platform yang jauh lebih kuat tetapi menggunakan API yang berbeda, mungkin masuk akal untuk merancang API Anda di sekitar abstraksi apa pun yang digunakan secara asli pada platform di mana kinerja merupakan masalah. Bahkan jika hal ini menyebabkan penurunan kecepatan 50% pada platform yang lebih kuat, mungkin layak jika memungkinkan peningkatan kecepatan 20% pada platform di mana kinerja paling penting.
sumber